Spring

SpringBoot 트랜잭션 직접 다루기

Seung__Yong 2023. 3. 29. 14:42

1. No Persistence provider for EntityManager named Hi

부트를 사용하지 않을 때는 META-INF 내부의 persistence.xml 파일의 unit-name과 persistenceUnitName을 서로 매칭 시켜주면 되지만 부트는 persistence.xml 파일 자체가 없습니다.(자동으로 설정)

 

스프링 부트 없이 다음과 같은 접근으로 EntityManagerFactory를 직접 사용하려고 하면  

"Exception in thread "main" jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named Hi" 와 같은 에러가 발생합니다

EntityManagerFactory emf = Persistence.createEntityManagerFactory("Hi");
EntityManager em = emf.createEntityManager();
 
EntityTransaction entityTransaction = em.getTransaction();

 

 

2. SpringBoot 트랜잭션 직접 다루기

아래와 같이 코드를 작성하면 에러가 발생합니다. @Transactional을 사용하라는 뜻인데 이를

"java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead"

 

    @Autowired
    private EntityManager em;

    @GetMapping("/")
    public String success(){

        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        
        ======================= 메인로직 ======================
        
        transaction.commit();
        return "success";
    }

제가 원한 것은 트랜잭션을 직접 이용하는 것이어서 해결책을 찾던 도중 다음과 같은 방법으로 해결했습니다

    @PersistenceUnit
    private EntityManagerFactory emf;
    

    @GetMapping("/")
    public String success(){
        EntityManager em = emf.createEntityManager();

        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        
        ======================== 메인 로직 ============================
        
        transaction.commit();
        return "success";
    }