java - 是否可以在 @Pre/PostPersist 监听器中保留新实体?

标签 java hibernate spring jpa

我正在尝试设置我的 hibernate 应用程序以在每次创建 Activity 实体时都保留一个新的 Notification 实体 - 目前,我已经尝试了 通知只是无法静默地持续存在(日志中没有错误,但永远不会执行sql)。

谁能确认甚至可以在 Hibernate pre/postPersist 监听器中持久化其他实体?

我已阅读文档:

A callback method must not invoke EntityManager or Query methods!

但我已经阅读了其他几个似乎表明这是可能的讨论主题。

作为引用,我尝试过的两种方法是:

  1. @PrePersist 方法 - 在 ActivityNotification 之间设置一个 cascade.ALL 关系,并在 PrePersist 方法中简单地创建一个新的 Notification 并将其链接到正在创建的 Activity,以期保留 Notification

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

有人可以确认我正在尝试的是可能的吗?

最佳答案

为什么要坚持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);
   }
}

更新:您可以尝试在 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}去工作。

关于java - 是否可以在 @Pre/PostPersist 监听器中保留新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639131/

相关文章:

java - JPA在多个事务中插入行,限制单个事务中的最大行数

java - Spring Boot 存储库双向加入

java - Hibernate映射文件和注解的区别

java - Spring 启动 YAML 配置 : Parametred keys

java - Spring Batch中的ItemReader代码重复问题

java - 防止 JScrollPane 扩展其 viewPort 组件

导入类时Java运行代码

unit-testing - 如何以编程方式创建 Spring 上下文?

java - Maven 多模块项目

java - Dagger 2 与注入(inject)器类