为什么你必须坚持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