JPA의 핵심으로 논리적인 개념으로 보이지는 않지만 Entity를 영구 저장하는 환경을 의미
EntityManager.persist(entity);
DB가 아닌 Persistence Context를 통해서 Entity를 영속화 한다.
persist() 시점에서 Entity를 영속성 컨텍스트에 저장함
EntityManager가 생성되면 1:1로 Persistence Context가 생성
application loading시 DB당 하나의 EntityMagerFactory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("name");
서버가 종료되는 시점에는 EntityManagerFactory를 닫는다
emf.close();
Data를 변경하는 모든 작업은 반드시 Transaction 안에서 이루어짐 (조회 x)
EntityTransaction tx = entityManager.getTransaction();
tx.begin(); : Transaction 시작
tx.commit(); : Transaction 수행
tx.rollback(); : 작업에 문제가 생겼을 시
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("멤버1");
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("멤버1");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 객체를 저장한 상태 (영속)
entityManager.persist(member);
// 멤버 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
entityManager.detach(member);
// 객체를 삭제한 상태
entityManager.remove(member);
Member a = entityManager.find(Member.class, "member1");
Member b = entityManager.find(Member.class, "member1");
System.out.println(a == b); // 동일성 비교 true
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
// EntityManager는 데이터 변경 시 트랜잭션을 시작해야 한다.
transaction.begin(); // Transaction 시작
entityManager.persist(memberA);
entityManager.persist(memberB);
// 이때까지 INSERT SQL을 DB에 보내지 않는다.
// 커밋하는 순간 DB에 INSERT SQL을 보낸다.
transaction.commit(); // Transaction 커밋
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // Transaction 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
// em.update(member) 또는 em.persist(member) 이런 코드가 있어야 하지 않을까?
transaction.commit(); // Transaction 커밋
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // 엔티티 삭제
// 영속 상태 (Persistence Context 에 의해 Entity 가 관리되는 상태)
Member member = new Member(200L, "A");
entityManager.persist(member);
entityManager.flush(); // 강제 호출 (쿼리가 DB 에 반영됨)
System.out.println("DB INSERT Query 가 즉시 나감. -- flush() 호출 후 -- Transaction commit 됨.");
tx.commit(); // DB에 insert query 가 날라가는 시점 (Transaction commit)
Transaction commit 발생 시 flush 자동 호출(flush 후 commit)
JPQL 쿼리 실행 시 flush 자동 호출
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 중간에 JPQL 실행
query = entityManager.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
em.setFlushMode(FlushModeType.COMMIT);
https://gmlwjd9405.github.io/2019/08/06/persistence-context.html
https://velog.io/@kwg527/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8