一尘不染

Hibernate-避免LazyInitializationException-从代理和会话中分离对象

hibernate

MyObject myObject = repositoryHibernateImpl.getMyObjectFromDatabase();
//transaction is finished, and no, there is not an option to reopen it
ThirdPartyUtility.doStuffWithMyObjectType( myObject );

至此,您已经定义了什么是懒惰的并且渴望加载的,并且第三方实用程序将尝试调用“
myObject”实例上的所有方法,这很好,因为您不想为懒惰地返回任何东西加载的属性,不幸的是它不会返回null,而是抛出LazyInitializationException

发生这种情况是因为您实际上是在对象的Hibernate代理上调用该方法,并且知道该方法尚未获取该数据,并引发异常。

甚至有可能获得具有null值的基础对象,以便getter仅返回null,并且不会引发异常?基本上是分离对象,以便Hibernate完全不再意识到它。延迟加载的对象的访问器必须返回null,它不能返回实际值,我们希望能够将实体转换为POJO,而不必创建看起来像实体的对象并且必须重新映射所有对象。价值观。


阅读 244

收藏
2020-06-20

共1个答案

一尘不染

假设您有一个字段,可以在getter中:

MyField getMyField() {
    if (Hibernate.isInitialized(myField)) {
        return myField;
    }
    return null;
}

从org.hibernate.Hibernate的javadoc中:

public static boolean isInitialized(Object proxy):检查代理或持久性集合是否已初始化。

2020-06-20