在Spring Boot中使用纯EntityManager在@PostConstruct中持久化JPA实体。
在Spring Boot中使用纯EntityManager在@PostConstruct中持久化JPA实体。
我有一个最小的Spring Boot应用程序,包括3个类:一个实体,一个在@PostConstruct中尝试填充数据库的组件和一个应用程序类。其他什么都没有。
当我运行应用程序时,我得到一个javax.persistence.TransactionRequiredException错误:当前线程中没有可靠的事务可用的EntityManager - 无法可靠地处理'persist'调用。
我不是唯一一个遇到这个错误的人,我阅读了很多帖子,但没有找到一个神奇的解决方案。
如果我自动装配一个EntityMananagerFactory并改用以下方式:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(new MyEntity());
em.getTransaction().commit();
em.close();
那就可以了。问题是:有没有更简单的方法(在正确的位置放置正确的注解)来获得一个可以持久化实体的EntityManager?我有很好的理由不创建一个repository(我尝试了这样做,可以工作)。
最好的问候 Jens
在Spring Boot中使用纯EntityManager持久化JPA实体的问题是,使用@PostConstruct注解的方法进行初始化时,EntityManager无法正常工作。为了解决这个问题,可以使用ApplicationReadyEvent事件处理程序来初始化实体管理器。
以下是解决方法的代码示例:
public class Initializer { EntityManager em; @EventListener(ApplicationReadyEvent.class) public void init() { em.persist(new MyEntity()); } }
上述代码中,使用@EventListener注解标记了一个方法,该方法会在应用程序准备就绪后被调用。在该方法中,可以使用EntityManager的persist方法将实体对象保存到数据库中。
你可以在以下链接中找到一个可工作的示例代码:[https://github.com/djarnis73/spring-boot-db-init-with-jpa-entity-manager](https://github.com/djarnis73/spring-boot-db-init-with-jpa-entity-manager)
原因:在Spring Boot中,@PostConstruct注解用于在应用程序启动时初始化bean和配置。然而,在@PostConstruct中使用纯EntityManager来持久化JPA实体是不正确的做法。
解决方法:可以使用@PersistenceContext注解来注入EntityManager,而不是使用@Autowired注解来注入。
代码示例:
import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; // ... @PersistenceContext private EntityManager entityManager; @PostConstruct public void init() { // 在这里使用entityManager来持久化JPA实体 }
通过使用@PersistenceContext注解注入EntityManager,我们可以在@PostConstruct方法中使用entityManager来持久化JPA实体。这样可以避免在@PostConstruct中直接使用@Autowired注入EntityManager而导致的问题。