Hibernate find方法有时返回代理

时间:2018-06-08 11:19:58

标签: java hibernate jpa

最近我的项目在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;
    }

如您所见,HouseTablesRoomsRooms也有Tables,每个子实体都与其父项有连接。

  1. 将表添加到HouseEntity
  2. 立即从HouseEntity删除表格。
  3. 对于1,houseRepository.findById将我的HouseEntity包裹在代理中,就好像它是延迟加载的一样。

    奇怪的是,如果我这样做:

    1. 将表格添加到RoomEntityHouseEntity的孩子。
    2. RoomEntity
    3. 中删除该表格

      然后houseRepository.findById会返回没有代理的HouseEntity

      我的问题是,为什么会发生这种情况?在这种情况下,为什么findById方法会返回代理实体?我需要在没有代理的情况下直接访问普通实体,即使代理在目标中填充了实体。

0 个答案:

没有答案