MyObject myObject = repositoryHibernateImpl.getMyObjectFromDatabase(); //transaction is finished, and no, there is not an option to reopen it ThirdPartyUtility.doStuffWithMyObjectType( myObject );
至此,您已经定义了什么是懒惰的并且渴望加载的,并且第三方实用程序将尝试调用“ myObject”实例上的所有方法,这很好,因为您不想为懒惰地返回任何东西加载的属性,不幸的是它不会返回null,而是抛出LazyInitializationException。
LazyInitializationException
发生这种情况是因为您实际上是在对象的Hibernate代理上调用该方法,并且知道该方法尚未获取该数据,并引发异常。
甚至有可能获得具有null值的基础对象,以便getter仅返回null,并且不会引发异常?基本上是分离对象,以便Hibernate完全不再意识到它。延迟加载的对象的访问器必须返回null,它不能返回实际值,我们希望能够将实体转换为POJO,而不必创建看起来像实体的对象并且必须重新映射所有对象。价值观。
假设您有一个字段,可以在getter中:
MyField getMyField() { if (Hibernate.isInitialized(myField)) { return myField; } return null; }
从org.hibernate.Hibernate的javadoc中:
public static boolean isInitialized(Object proxy):检查代理或持久性集合是否已初始化。