2012-10-04 123 views
1

我一直在將一個項目從JPA移植到Hibernate本地實現中(被團隊取消:<)。Hibernate攔截器PostLoad

我必須處理的一件令人難以置信的事情是@PostLoad不支持Hibernate本地庫。所以我Google了一下。

首先我看着EventListeners - > Nope,配置類似乎不再讓你設置它。當我將它注入cfg文件時,聽衆仍然拒絕工作。

好的,接下來,我看着攔截器 - >沒有,沒有後負載。實例化也不會傳入對象本身。多麼方便。最後,我看着LifeCycle - >哇,是的,它有onLoad(),但是它傳入Session和Serializable Id但沒有對象。尼斯。

無論如何,我想要的是使用名爲onPostLoad(Object object,yadda yadda yadda)的處理函數來偵聽後加載的內容。有沒有人有一個很好的建議?

回答

0

攔截器確實有一個onLoad()方法。你檢查過嗎?它的簽名是這樣的:

@Override 
public boolean onLoad(Object entity, Serializable id, Object[] state, 
     String[] propertyNames, Type[] types) { 
    // TODO Auto-generated method stub 
    return super.onLoad(entity, id, state, propertyNames, types); 
} 

請注意,如果在實體更改屬性,你將不得不返回true,並返回false,否則(說你是簡單地計算實體,例如)。

如果你正在使用Spring,你將你的連線在攔截這樣的:

<bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="entityInterceptor"> 
     <bean class="my.company.MyInterceptor"/> 
    </property> 
</bean> 
+0

其實我意識到這一點,但我沒有意識到變量也被傳入了。雖然必須執行初始化我自己很煩,我想沒有別的辦法。我仍然無法相信Hibernate沒有一個簡單的處理器來處理如此簡陋的事情。 –

+0

對於你的情況,讓你的實體實現生命週期似乎是一個更好的交易。由於它是實現接口的實體本身,因此無論如何(通過這個)你是否有實例?或者我錯過了你的問題? – Jeshurun

+0

謝謝,這很像魔術。在那些笨重的eventlisteners和設計奇怪的intercepters之後,我感到非常驚訝的是,生命週期是一個非常優雅的解決方案(我認爲它的工作原理類似於Interceptors,它像一個處理程序類,而不是真的只是......在實體本身)。解決了我的問題! –