
EntityManagerFactory
EntityManagerFactory.close();로 닫아준다.Connection Pooling에 대한 자원이 반납된다. EntityManager
Threan safe하지 않음!)Transactional단위로 실행된다.EntityManager.close()를 해주어야 내부적으로 DB연결을 반환한다.Transactional처리 후 닫아준다.Transactional
변경, 생성 작업은 반드시 여기 안에서 이루어져야만 한다. EntityManager em = EntityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
transaction.commmit();
transaction.rollback();

EntityManager가 생성되면 영속성 컨텍스트와 1:1로 생성된다.
Entity를 영구 저장하는 곳영속성 컨텍스트는 Application과 DB사이에서 객체를 보관하는 논리적 개념이다.EntityManager룰 통해 영속성 컨텍스트에에 접근할 수 있다.
DB에 저장된 상태는 아니다! entityManager.persist(Entity);
entityManager.detach(Entity);
entityManager.remove(Entity);

// 영속성 컨텍스트 1차 캐시에 저장된다.
entityManager.persist(Entity);
//1차 캐시에서 조회한다.
Object find = entityManager.find(Object.class, Entity.getId);
영속성 컨텍스트를 지우면서 삭제된다. //1차 캐시에서 조회한다.
Object find = entityManager.find(Object.class, 1L);
Object find2 = entityManager.find(Object.class, 1L);
영속성 컨텍스트에서 관리되는 1차캐시에서 존재하는 값을 가져오기 때문에 언제나 같은 값을 보장한다.읽기(REPEATABLE READ) 등급의 트랜잭EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
transaction.commit(); // [트랜잭션] 커밋
.commit하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) 이런 코드가 있어야 하지 않을까?
transaction.commit();
.commit하기만 하면 DB로 UPDAT 쿼리가 자동으로 나가게 된다.@DynamicUpdate@DynamicUpdate를 통해 엔티티 수정 시 변경된 필드만 반영되도록 할 수 있다.entityManager.flush()transaction.commit()JPQL 쿼리 실행주의사항 : flush()한다고 영속성 컨텍스트가 비워지지 않는다. 단지 DB에 동기화를 시킬 뿐이다.
🔎참고