[Spring] @Autowired vs @PersistenceContext

EntityManagerFactory emf = Persistence.createEntityManagerFactory("project");
EntityManager em = emf.createEntityManager();

jpa에서 Entitymanagerfactory를 통해서 Entitymanager를 뽑아쓰는것과 다르게, 스프링에서는 스프링부트가 @PersistenceContext어노테이션만 달아주면 바로 EntityManager를 사용할 수 있게 해준다.

@PersistenceContext
EntityManager em;

 

@Autowired가 스프링 빈을 주입한다면, @PersistenceContext는 영속성 콘텍스트를 주입하는 jpa 어노테이션이다.

 

이때 @PersistenceContext 대신 @Autowired를 사용하면 안되는데, @PersistenceContext가 멀티쓰레드에서 각자 다른 EntityManager를 사용하도록 해주기 때문이다.

(참고:EntityManagerFactory는 thread-safe하지만 EntityManager는 thread-safe하지 않다)

 

https://stackoverflow.com/questions/31335211/autowired-vs-persistencecontext-for-entitymanager-bean/58891587#58891587