2011-12-26 24 views
9

我試圖設置我的休眠應用程序來堅持一個新的Notification實體每次創建一個Activity實體 - 目前,我已經嘗試Notification只是無法堅持保持沉默(日誌中沒有錯誤,但sql永遠不會執行) 。是否有可能在@ Pre/PostPersist監聽器中保留新的實體?

任何人都可以確認它甚至可以在Hibernate pre/postPersist偵聽器中保留額外的實體嗎?

我已閱讀的文檔中:

回調方法不能調用EntityManager的或查詢方法!

但我已經閱讀了幾個似乎表明這是可能的討論主題。

僅供參考,我已經嘗試了兩種方法:

  1. @PrePersist方法 - 設置ActivityNotification之間的cascade.ALL關係,並在PrePersist方法簡單地創建一個新的Notification並將其鏈接到Activity被創建,希望Notification將被持續。

  2. @PostPersist方法 - 使用@Configurable,並在服務ListenerClass,佈線和創建新的Notification實體,然後顯式調用entityManger一直存在

有人可以證實我想什麼是可能的?

回答

1

爲什麼你必須堅持Notification@PrePersist@PostPersist函數?下面的代碼應該堅持兩個實體:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     act.setNotification(new Notification()); 
     em.persist(act); 
    } 
} 

UPDATE:你可以嘗試創建這樣的活動的構造函數中的鏈接:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 

    public Activity() { 
     this.notification = new Notification(); 
    } 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     em.persist(act); 
    } 
} 

需要注意的一點是,我認爲你不能使用@PostPersist。更確切地說,你必須連接NotificationActivity,然後繼續Activity才能使cascade={CascadeType.PERSIST}正常工作。

+0

謝謝 - 我需要在pre/postPersist方法中添加通知,因爲我想確保每次創建Activity時都會創建相應的通知。如果您認爲通知是需要保證的審計對象,那麼第一個解決方案就有可能會有人調用em.persist(act);代碼庫中的任何其他位置(批處理/操作類或任何其他服務類),除非它們也添加通知代碼,否則我們不會得到我們的審計。 第二種解決方案是我爲我的方法嘗試1)在原始帖子中,但是正在悄然失敗。 – rhinds 2011-12-27 09:05:02

+0

@rhinds我剛剛更新了我的答案。你可以在Activity的構造函數中創建鏈接。 – 2011-12-27 09:25:49

+0

謝謝,我會試試這個 - 儘管它仍然看起來不太理想,因爲在持續之前仍然會對編輯進行打開。看起來像預留持久性應該是做這種操作的正確位置,例如,我們以前使用prePersist方法來設置所有對象的修改日期,並且意味着修改日期永遠不會被手動更改或覆蓋 – rhinds 2011-12-27 17:32:04

2

您可以使用StatelessSession接口在Hibernate事件偵聽器中插入其他實體(插入,更新,刷新等)。但我不知道這是否也可以使用嚴格的JPA唯一代碼(EntityManagerFactoryEntityManager)。

+0

是的,它是特定於實現的,但Hibernate和EclipseLink都有類似的東西。 – wrschneider 2011-12-27 01:36:53

+0

謝謝 - 這適合運行時間持續?我注意到文檔將其稱爲批處理操作界面,並且不使用任何第一/第二級緩存。 – rhinds 2011-12-27 17:23:52

相關問題