gpt4 book ai didi

java - 如何解决org.hibernate.LazyInitializationException?

转载 作者:行者123 更新时间:2023-12-01 23:54:16 24 4
gpt4 key购买 nike

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.t4bt.gov.persistence.entities.Experts.institutaionList,没有 session 或 session 被关闭

最佳答案

您在问题(代码?)中提供的细节非常少,因此它必须是有关延迟加载的概括答案。将来,如果您想得到答案,请提供有关实际问题的具体信息,以及您尝试解决问题的描述。

当您在 session 关闭后(通常是在事务结束后)尝试访问延迟加载的属性时,就会发生延迟初始化。延迟初始化的工作方式是,当您获取对象时,它不会获取延迟初始化的属性,但是当您实际尝试访问它时,Hibernate 会对数据库执行另一个查询来获取它。

以下内容会产生这样的错误:

public class Something {
[...]
@OneToMany(fetch = FetchType.LAZY)
private List<SomethingElse> somethingElse;

public List<SomethingElse> getSomethingElse() {
return somethingElse;
}
}

public class SomethingDao {
@Inject
private EntityManager em;

@Transactional
public Something getById(final Integer id) {
return em.find(Something.class, id);
}
}

public class SomethingService {
@Inject
private SomethingDao dao;

public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) {
final Something something = dao.getById(somethingId);
return something.getSomethingElse() //Throws LazyInitializationException
}
}

这里的事务(以及 session )仅存在于 dao 类中。一旦离开道法, session 就消失了。因此,当您尝试访问服务中的延迟加载属性时,当 Hibernate 尝试联系 session 以检索它时,它将失败。

为了避免这种情况,有几种可能性。

  1. 将 Something 类的注释更改为 @OneToMany(fetch = FetchType.EAGER)该属性不再是延迟加载的,因此不再有问题。
  2. @Transactional添加到服务方法。然后,对 getSomethingElse() 的调用将与获取 Something 对象位于同一事务中,并且在执行此操作时 session 仍处于 Activity 状态。
  3. 在 Dao 方法中添加对 getSomethingElse() 的调用。然后,它将在离开 Dao 类(和事务)之前初始化属性(从数据库中获取它),并且它将在事务之外可用,无需与 session 通信来检索它。<

关于java - 如何解决org.hibernate.LazyInitializationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com