2012-11-28 45 views
2

我正在使用的項目使用Hibernate進行持久化。加載休眠實體時總是調用方法

該項目一分爲個子項目,其中四個是與此有關:

  • 消息-DOM
  • 用戶服務
  • 消息服務
  • 情況下,服務

消息實體(在用戶dom中)包含一個String userID字段和一個@Transient String userName字段。另一個實體Case與消息具有OneToOne關係。問題是:

  • 每次我們加載消息(直接在消息服務中,或者通過在case-service中加載一個Case來間接加載),我們需要設置它的userName字段。
  • userName通過調用用戶服務來檢索。
  • 無法從message-dom調用用戶服務(出於依賴性原因)。

我見過有一個實體的@PostLoad註解,但顯然這些在這裏沒有幫助,因爲我們不能從實體調用服務。目前我們手動進行服務調用,但這很容易出錯(特別是在案例中間接加載消息時)。

我們如何確保每次加載Message實體時都能設置字段?

+0

實現負荷後事件,並將其註冊的配置對象 – Firo

+0

@Firo上:你能否詳細說明一下?這似乎朝着正確的方向發展,但我不知道配置對象是 – ARRG

回答

3
在最終應用中,其中所有部件都一起實現 org.hibernate.event.PostLoadEventListener和通過XML添加它

<hibernate-configuration> 
    <session-factory> 
     ... 
     <event type="load"> 
      <listener class="com.eg.MyPostLoadListener"/> 
      <listener class="org.hibernate.event.def.DefaultPostLoadEventListener"/> 
     </event> 
    </session-factory> 
</hibernate-configuration> 

或通過代碼

Configuration cfg = new Configuration(); 
PostLoadEventListener[] stack = { new MyPostLoadListener(), new DefaultPostLoadEventListener() }; 
cfg.EventListeners().setPostLoadEventListeners(stack); 
+0

+1。只需:投票支持'xml'配置,以支持稍後擴展 –