是否可以在@ Pre / PostPersist Listener中保留新实体?

时间:2011-12-26 21:11:02

标签: java hibernate spring jpa

我正在尝试设置我的hibernate应用程序,以便在每次创建Notification实体时持久保存新的Activity实体 - 目前,我尝试Notification的所有内容都无法保留静默(日志中没有错误,但从不执行sql)。

任何人都可以确认甚至可以在Hibernate pre / postPersist监听器中保留其他实体吗?

我已阅读文档:

  

回调方法不能调用EntityManager或Query方法!

但是我已经阅读了其他几个讨论线程,似乎表明它是可能的。

作为参考,我尝试的两种方法是:

  1. @PrePersist方法 - 在ActivityNotification之间设置cascade.ALL关系,并在PrePersist方法中创建一个新的Notification并将其链接到正在创建Activity,希望Notification能够保留。

  2. @PostPersist方法 - 使用@Configurable和ListenerClass,在服务中连接并创建新的Notification实体,然后显式调用entityManger persist

  3. 有人可以确认我的尝试是可能的吗?

2 个答案:

答案 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。更准确地说,您必须先将NotificationActivity关联,然后才能Activity暂停cascade={CascadeType.PERSIST}才能正常工作。

答案 1 :(得分:2)

您可以使用StatelessSession接口在Hibernate事件侦听器(插入,更新,刷新等)中保留其他实体。但我不知道这是否也可以使用严格的JPA代码(EntityManagerFactoryEntityManager)。