2013-04-08 31 views
3

我正在將我的實體轉換爲DTO,並且我想將NULL設置爲所有字段的DTO值,這是所有字段的延遲加載和未初始化(因爲我不想一直傳輸所有數據)。Java/Hibernate:如果字段是延遲加載代理而不是實際數據,如何檢測?

我已經試過:

if (!(entity.getNationality() instanceof HibernateProxy)) 
    this.setNationalityFromEntity(entity.getNationality()); 

但它沒有似乎幫助。 歡迎任何建議!

謝謝!

回答

2

該類始終是代理,無論它是否已初始化,因此如果您只是檢查代理的實例,那麼每次都會排除它。延遲加載不會導致實體上的代理引用被替換爲對新對象的引用,它只是填充字段。

要知道它是否被實際初始化,你需要問它!

if (HibernateProxy.class.isInstance(entity.getNationality())) { 
    HibernateProxy proxy = HibernateProxy.class.cast(entity.getNationality()); 
    if (!proxy.getHibernateLazyInitializer().isUninitialized()) { 
    this.setNationalityFromEntity(entity.getNationality()); 
    } 
} 
+1

這基本上是'Hibernate.isInitialized(..)'做的,但是更大程度上。但是,是的,它指出了我的正確方向,並且通過進一步研究惰性實例,我發現實體不得在開放會話中正確指示初始化狀態。我找到的最簡單的解決方案是調用'Session.evict(..)',然後'Hibernate.isInitialized()'按預期工作。 – 2013-04-09 00:52:49

4

他們的方法,我們做我們的實體是我們布爾方法該做,不會觸發延遲加載的方式檢查。例如,如果我們的實體有所謂的「associatedSomething」,相關的實體,然後檢查方法,如果是關聯實體已經延遲加載是:

public boolean isAssociatedSomethingLoaded() { 
     if (associatedSomething instanceof HibernateProxy) { 
      if (((HibernateProxy)associatedSomething).getHibernateLazyInitializer().isUninitialized()) { 
       return false; 
      } 
     } 
     return (getAssociatedSomething() != null); 
    } 

注意:不要在支票使用getAssociatedSomething()這一點很重要,因爲這可以確保關聯的實體在檢查過程中不會延遲加載。

相關問題