爲什麼你必須堅持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
。更確切地說,你必須連接Notification
到Activity
,然後繼續Activity
才能使cascade={CascadeType.PERSIST}
正常工作。
謝謝 - 我需要在pre/postPersist方法中添加通知,因爲我想確保每次創建Activity時都會創建相應的通知。如果您認爲通知是需要保證的審計對象,那麼第一個解決方案就有可能會有人調用em.persist(act);代碼庫中的任何其他位置(批處理/操作類或任何其他服務類),除非它們也添加通知代碼,否則我們不會得到我們的審計。 第二種解決方案是我爲我的方法嘗試1)在原始帖子中,但是正在悄然失敗。 – rhinds 2011-12-27 09:05:02
@rhinds我剛剛更新了我的答案。你可以在Activity的構造函數中創建鏈接。 – 2011-12-27 09:25:49
謝謝,我會試試這個 - 儘管它仍然看起來不太理想,因爲在持續之前仍然會對編輯進行打開。看起來像預留持久性應該是做這種操作的正確位置,例如,我們以前使用prePersist方法來設置所有對象的修改日期,並且意味着修改日期永遠不會被手動更改或覆蓋 – rhinds 2011-12-27 17:32:04