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

如何解决org.hibernate.lazyInitializationException?

尉迟鑫鹏
2023-03-14

org.hibernate.lazyInitializationException:未能缓慢初始化角色的集合:com.t4bt.gov.persistence.entities.experts.InstitutaIonList,未关闭会话或会话

共有1个答案

白志勇
2023-03-14

您在您的问题(代码?)中提供的细节很少,所以它必须是一个关于惰性加载的概括答案。今后,如果你想要答案,请提供关于实际问题的具体信息,以及关于你试图解决问题的描述。

当您在会话关闭后(通常是在事务结束后)尝试访问懒散加载的属性时,就会发生LazyInitialization。懒惰初始化的工作方式是,当您获取对象时,它不获取懒惰初始化的属性,但当您实际尝试访问它时,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
    }
}

要避免这种情况,有几种可能。

  1. 将Something-class的批注更改为@OneTomany(fetch=FetchType.Eage)该属性不再是惰性加载的,因此不会出现更多问题。
  2. @transactional添加到service-method。那么对getSomethingElse()的调用将与提取Something-object的事务相同,并且在这样做时会话仍然是活动的。
  3. 在dao-method中添加对getSomethingElse()的调用。然后,它将在离开DAO-类(和事务)之前初始化属性(从数据库获取它),并且它将在事务之外可用,不需要与会话通信来检索它。
 类似资料:
  • 问题内容: 我正在尝试编写简单的Java代码,以在控制台上显示MongoDB集合。我在类路径中添加了mongodb-driver-3.0.0.jar。 但是,当我尝试执行代码时,它在数据库连接行给了我以下错误: 线程“主”中的异常java.lang.NoClassDefFoundError:com.montan.app.MongoDbJdbc.main(MongoDbJdbc.java:12)上的

  • 问题内容: 我试图通过我的Web项目上的applet访问客户端的临时目录。 当我自己运行小程序时,它毫无问题地得到了。 当我尝试使用javascript并调用applet方法在我的项目上获取它时,我在javascript控制台上运行。当我尝试读取temp目录下的文件时,我也遇到同样的异常。 这正是我所看到的: 怎么解决? 问题答案: 最简单的解决方案是对applet进行签名。

  • 问题内容: 我已经尝试了Oracle Java教程中的两个示例。它们都可以正常编译,但是在运行时都出现以下错误: 我想我可能将Main.java文件放在错误的文件夹中。这是目录层次结构: 这里是 我在这里做错了什么? 更新 将Main类放入graphics包中(添加package graphics;到其中)后,将类路径设置为“ _test”(包含图形的文件夹),进行编译,然后使用java grap

  • 问题内容: 我有2个函数,都返回诺言: 现在,我有了一个清单,在这两个诺言得到解决后,我想立即更新 已解决的主题应如下所示 问题答案: 创建一个承诺,当您通过的所有承诺均被拒绝或 任何 拒绝时,该承诺都会自动解决。 如果像您一样将其传递给数组,则处理成功解析的函数将收到一个数组,其中每个项目都是针对相同索引的诺言的分辨率,例如: 我个人认为传递对象更具可读性,这样您就可以在处理程序中获得一个对象,

  • 我在Oracle的Java教程中尝试了这两个示例。它们都可以很好地编译,但在运行时都会出现以下错误: 我想我可能有文件位于错误的文件夹中。 以下是目录层次结构: 这里是: 我做错了什么? 更新 在我将类放入包(我添加了)之后,将类路径设置为“_test”(包含图形的文件夹),编译它,并使用(从命令行),它工作了。 更新非常晚#2 我没有使用Eclipse(只是记事本和JDK),上面的更新解决了我的

  • 我已经在Oracle的Java教程中尝试了这两个示例。它们都编译得很好,但在运行时,都出现了以下错误: 我想文件可能在错误的文件夹中。 非常晚的更新#2 我没有使用Eclipse(只有记事本++和JDK),上面的更新解决了我的问题。然而,似乎这些答案中有许多是针对Eclipse和IntelliJ IDEA的,但它们有相似的概念。