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";
}