首页 > 解决方案 > 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;
    }

如您所见,HousehasTablesRoomsRoomsalso has Tables,每个子实体都与其父实体有联系。

  1. 将表添加到HouseEntity
  2. 之后立即从表中删除HouseEntity

对于 1,houseRepository.findById将我HouseEntity包裹在代理中,就好像它是延迟加载的一样。

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

  1. 将表添加到 a RoomEntity,它是 的子级HouseEntity
  2. 从 中删除表RoomEntity

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

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

标签: javahibernatejpa

解决方案


推荐阅读