在Spring Boot中使用纯EntityManager在@PostConstruct中持久化JPA实体。

10 浏览
0 Comments

在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

0
0 Comments

在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)

0
0 Comments

原因:在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而导致的问题。

0