java - Hibernate find 方法有时会返回代理
问题描述
最近我的项目遇到了一个非常奇怪的问题,即 JPAfindOne(id)
返回代理对象而不是完整对象。
这是场景。考虑如下所示的实体及其连接。
@Table(name = "HOUSE")
@Entity
@EqualsAndHashCode
@Setter
@ReadPermission(expression = "user has rights for template snapshots AND has filter")
public class HouseEntity extends VersionedEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "house", fetch = FetchType.LAZY, orphanRemoval = true)
public List<RoomEntity> getRooms() {
return rooms;
}
@OneToMany(cascade = CascadeType.ALL, mappedBy = "template", fetch = FetchType.LAZY, orphanRemoval = true)
public List<TableEntity> getTables() {
return tables;
}
}
@Entity
@Table(name = "ROOMS")
public class Room {
@ManyToOne(fetch = FetchType.LAZY)
public HouseEntity getHouse() {
return house;
}
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
public List<TableEntity> getTables() {
return tables;
}
}
@Entity
@Table(name = "TABLES")
public class TableEntity{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "HOUSE_ID")
public HouseEntity getHouse() {
return template;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ROOM_ID")
public RoomEntity geRoom() {
return room;
}
如您所见,House
hasTables
和Rooms
,Rooms
also has Tables
,每个子实体都与其父实体有联系。
- 将表添加到
HouseEntity
- 之后立即从表中删除
HouseEntity
。
对于 1,houseRepository.findById
将我HouseEntity
包裹在代理中,就好像它是延迟加载的一样。
奇怪的是,如果我这样做:
- 将表添加到 a
RoomEntity
,它是 的子级HouseEntity
。 - 从 中删除表
RoomEntity
。
然后houseRepository.findById
返回HouseEntity
没有代理的。
我的问题是,为什么会发生这种情况?在这种情况下,为什么该findById
方法会返回一个代理实体?即使代理在目标中填充了实体,我也需要直接访问没有代理的普通实体。
解决方案
推荐阅读
- php -
如果后面的内容为空,则隐藏空行 - node.js - 从网站下拉列表中随机选择项目 - puppeteer、nodeJS
- django - Django:如何使用 Modelviewset 进行 rest api 注释
- c# - 尝试在团队中部署机器人时找不到应用程序配置选项卡
- sql-server - 无法在 Visual Studio 上安装 SQL Server 集成服务
- excel - 如何生成随机字符串RANDBETWEEN?
- javascript - 事件 onclick [javascript] 后在 textarea 中保留选定的高亮显示
- amazon-web-services - 为不同客户隔离 CloudWatch 指标
- sql - DB2 SQL - 如何显示过去 12 周的计数,每周都有自己的列
- android - 如何创建一个布局,如谷歌日历应用程序的“1 天”视图