当前位置: 首页 > 知识库问答 >
问题:

JPA Hibernate惰性多对一提取代理

曹超
2023-03-14

我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西

我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们

@Entity
public class Department {
    @Id
    private Integer id;

    //...
}

1/

@Entity
public class Employee {
    @Id
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY, optional = true)
    @JoinColumn(name = "id_department", referencedColumnName = "id")
    private Department department;

    //...
}
SELECT e FROM Employee e LEFT JOIN FETCH e.department WHERE e.id=:id

2/

@Entity
public class Employee {
    @Id
    private Integer id;

    @ManyToOne(fetch = FetchType.EAGER, optional = true)
    @JoinColumn(name = "id_department", referencedColumnName = "id")
    private Department department;

    //...
}

JPQL查询:

SELECT e FROM Employee e WHERE e.id=:id

=>两次选择=>速度较慢,但department作为department加载,并且在应用程序的视图部分中一切正常

共有1个答案

漆雕深
2023-03-14

问题是,当您使用惰性加载时,您将获得类的代理(如您所述),并且只有当hibernatesession仍然打开时,该代理才能从数据库中获取数据。当将数据返回到视图时,会话似乎被关闭了,所以当试图使用视图中懒散加载的字段时,您会得到异常。

可能的解决办法:

  • 将字段保留为fetch eager,并为针对您的实体的每个查询支付开销(这可能不好,可能会影响性能,但不失为一种解决方案)。
  • 在休眠会话关闭之前将字段保持为惰性,并使用适当的get方法,以便代理检索会话关闭后要使用的相关数据。
 类似资料:
  • 我的理解是,默认情况下,Hibernate将所有关系类型的FetchType设置为lazy。 在我的例子中,我有一个双向的OneToMany-ManyToOne关系,如下所示: 另一个问题是我如何得到一个有特定名字的孩子?是否可以通过存储库进行操作?还是需要getChildren(parentId)并迭代直到找到以特定方式命名的那个? 编辑:在一些建议之后,我继续这样实现了我的ChildRepos

  • 我有两个大表(每个表>一亿行),让我们把它们称为Parent和Child(Parent与Child有一个懒散的一对多关系)。当我使用联接提取时,查询速度非常慢,而且我还得到一个Hibernate警告“HH000104 firstresult maxresults specified with collection fetch Application in Memory”,因为我使用了一个限制。 因

  • 我有一个简单的控制器返回一个用户对象,这个用户有一个属性坐标,它具有hibernate属性FetchType.lazy。 当我尝试获取这个用户时,我总是必须加载所有坐标来获取用户对象,否则当Jackson尝试序列化用户时抛出异常: 和控制器: 有办法告诉Jackson不要连载未蚀刻的对象?我一直在寻找3年前发布的实现Jackson-Hibernate-Module的其他答案。但也许可以通过杰克逊的

  • 我有两个实体。我想在持久化所有者实体时级联插入子实体,并将子实体的SSO_ID设置为生成器为所有者生成的实体。 ID类是: 相反,我得到了一个错误: 插入hub_users_emails(user_sso_idemail_typesso_idstart_dateuser_mail)值 (?, ?, ?, ?, ?) (等) 绑定参数[1]as[BIGINT]-[1234837655]= (等) 将

  • null 但是在Eclipse中测试它之后,它渴望得到所有的东西。 是否取决于我使用的是JPA还是Hibernate?

  • 考虑以下实体: 的应该被延迟获取。问题是,当使用