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에 동기화를 시킬 뿐이다.
🔎참고