在@PostConstruct 的 spring 引导中使用纯 EntityManager 持久保存 JPA 实体
Persisting JPA entity using plain EntityManager in spring boot in @PostConstruct
我有一个最小的 spring 引导应用程序,由 3 个 class 组成:一个实体,一个试图在 @PostConstruct 中填充数据库的组件和一个应用程序 class。没有别的。
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Component
@Transactional
public class Initializer {
@Autowired
EntityManager em;
@PostConstruct
public void populate() {
em.persist(new MyEntity());
}
}
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
}
当我 运行 应用程序时,我得到一个 javax.persistence.TransactionRequiredException:当前线程没有可用的实际事务的 EntityManager - 无法可靠地处理 'persist' 调用
我不是唯一遇到该错误的人,我阅读了很多帖子,但没有找到神奇的解决方案。
如果我自动装配一个 EntityMananagerFactory 而不是:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(new MyEntity());
em.getTransaction().commit();
em.close();
有效。问题是:是否有更简单的方法(将正确的注释放在正确的位置)来获得可以保留实体的 EntityManager?我有充分的理由不创建存储库(我尝试这样做并且有效)。
最好的问候延斯
据我了解,当我们想要初始化 bean 和配置时,@PostConstruct 在应用程序启动时被调用。我认为@PostConstruct 不是这样做的正确位置。
但是您可以在您的 entityManger 上使用 @PersistenceContext 而不是自动装配它。
所以在尝试了很多不同的东西之后,我认为我找到了一个可行的解决方案,其中初始化是在 ApplicationReadyEvent 处理程序中完成的,而不是在 @PostConstruct 方法中完成的:
@Component
public class Initializer {
@PersistenceContext
EntityManager em;
@EventListener(ApplicationReadyEvent.class)
@Transactional
public void init() {
em.persist(new MyEntity());
}
}
工作示例:https://github.com/djarnis73/spring-boot-db-init-with-jpa-entity-manager
我有一个最小的 spring 引导应用程序,由 3 个 class 组成:一个实体,一个试图在 @PostConstruct 中填充数据库的组件和一个应用程序 class。没有别的。
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Component
@Transactional
public class Initializer {
@Autowired
EntityManager em;
@PostConstruct
public void populate() {
em.persist(new MyEntity());
}
}
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
}
当我 运行 应用程序时,我得到一个 javax.persistence.TransactionRequiredException:当前线程没有可用的实际事务的 EntityManager - 无法可靠地处理 'persist' 调用
我不是唯一遇到该错误的人,我阅读了很多帖子,但没有找到神奇的解决方案。
如果我自动装配一个 EntityMananagerFactory 而不是:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(new MyEntity());
em.getTransaction().commit();
em.close();
有效。问题是:是否有更简单的方法(将正确的注释放在正确的位置)来获得可以保留实体的 EntityManager?我有充分的理由不创建存储库(我尝试这样做并且有效)。
最好的问候延斯
据我了解,当我们想要初始化 bean 和配置时,@PostConstruct 在应用程序启动时被调用。我认为@PostConstruct 不是这样做的正确位置。
但是您可以在您的 entityManger 上使用 @PersistenceContext 而不是自动装配它。
所以在尝试了很多不同的东西之后,我认为我找到了一个可行的解决方案,其中初始化是在 ApplicationReadyEvent 处理程序中完成的,而不是在 @PostConstruct 方法中完成的:
@Component
public class Initializer {
@PersistenceContext
EntityManager em;
@EventListener(ApplicationReadyEvent.class)
@Transactional
public void init() {
em.persist(new MyEntity());
}
}
工作示例:https://github.com/djarnis73/spring-boot-db-init-with-jpa-entity-manager