我正在尝试设置我的hibernate应用程序,以便在每次创建Notification
实体时持久保存新的Activity
实体 - 目前,我尝试Notification
的所有内容都无法保留静默(日志中没有错误,但从不执行sql)。
任何人都可以确认甚至可以在Hibernate pre / postPersist监听器中保留其他实体吗?
我已阅读文档:
回调方法不能调用EntityManager或Query方法!
但是我已经阅读了其他几个讨论线程,似乎表明它是可能的。
作为参考,我尝试的两种方法是:
@PrePersist
方法 - 在Activity
和Notification
之间设置cascade.ALL关系,并在PrePersist方法中创建一个新的Notification
并将其链接到正在创建Activity
,希望Notification
能够保留。
@PostPersist
方法 - 使用@Configurable
和ListenerClass,在服务中连接并创建新的Notification
实体,然后显式调用entityManger persist
有人可以确认我的尝试是可能的吗?
答案 0 :(得分:2)
为什么必须在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 :您可以尝试在Activity的构造函数中创建链接,如下所示:
@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}
才能正常工作。
答案 1 :(得分:2)
您可以使用StatelessSession接口在Hibernate事件侦听器(插入,更新,刷新等)中保留其他实体。但我不知道这是否也可以使用严格的JPA代码(EntityManagerFactory
和EntityManager
)。