2012-10-07 34 views
10

我正在使用JPA(Hibernate作为我的JPA提供程序)。我真的试图避免休眠细节并使用JPA规范。我有一个初始化懒惰实体的函数。不幸的是,它使用Hibernate特定的功能。这是我的功能:初始化懒惰实体的标准JPA方法

private T initializeAndUnproxy(T entity) { 
     if (entity == null) { 
      throw new 
       NullPointerException("Entity passed for initialization is null"); 
     } 

     Hibernate.initialize(entity); 
     if (entity instanceof HibernateProxy) { 
      entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); 
     } 
     return entity; 
    } 

是否有任何纯粹的JPA方式来初始化实体?

回答

7

似乎没有一种标准的方式来初始化实体。

还有就是要检查,如果实体被初始化(满载),或者不是一个标准的方式,并通过PersistenceUnitUtil这(见How to test whether lazy loaded JPA collection is initialized?

只要实体仍连接,您可以访问它的属性强制初始化。这不是很整洁,但在一定程度上起作用。缺点是,根据属性的确切性质(例如包含许多元素的集合),您可能会向数据库发起数十次,数百次甚至数千次查询。

在许多情况下,您最好先指定需要初始化的内容,而不是通过编程强制初始化(未知)实体。我写了一篇关于这个here的文章。

但是,如果您确实需要通过对某个标准框架方法的单个调用完全初始化实体,那么不幸的是,似乎没有办法,您现在必须坚持使用Hibernate特定的代码。

+2

关于最后一句:我从来没有使用它,但如何使用Entitygraphs获取完整的实体(https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)?是否有可能获取实体的实体图并将其元模型的所有惰性属性作为AttributeNodes添加到它(然后获取它)? –

相关问题