最近我的项目在JPA findOne(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
有Tables
和Rooms
,Rooms
也有Tables
,每个子实体都与其父项有连接。
HouseEntity
HouseEntity
删除表格。对于1,houseRepository.findById
将我的HouseEntity
包裹在代理中,就好像它是延迟加载的一样。
奇怪的是,如果我这样做:
RoomEntity
,HouseEntity
的孩子。RoomEntity
。然后houseRepository.findById
会返回没有代理的HouseEntity
。
我的问题是,为什么会发生这种情况?在这种情况下,为什么findById
方法会返回代理实体?我需要在没有代理的情况下直接访问普通实体,即使代理在目标中填充了实体。