2012-10-07 57 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添加到它(然後獲取它)? –

相關問題