비영속 (new / transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
즉, 객체(Entity)를 처음 생성했을 때
영속 (managed)
영속성 컨텍스트에 관리되는 상태
저장 : entityManager.persist(entity)
조회 : entityManager.find(entity) -> 영속성 컨텍스트에 데이터가 없는 경우
준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
삭제 (removed)
삭제된 상태
// Member Entity 정의
@Entity
class Member(
@Id
val id: Long = 0L,
var name: String
)
// 객체 생성
val member: Member = Member(id = 1L, name = "member1")
val emf: EntityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName)
// EntityManager 생성
val em: EntityManager = emf.createEntityManager()
val tx: EntityTransaction = em.transaction
tx.begin()
// 객체 생성 - 비영속 상태
val member: Member = Member(id = 1L, name = "member1")
// 객체 저장 - 영속 상태
em.persist(member)
em.detach(member)
em.remove(member)
// 객체 생성 - 비영속 상태
val member: Member = Member(id = 1L, name = "member1")
// 객체 저장 - 영속 상태
em.persist(member)
// Entity 조회
val findMember: Member = em.find(Member::class.java, 1L)
트랜잭션 격리 수준 (Isolation Level)
1. READ UNCOMMITED : 커밋되지 않은 데이터도 읽기
2. READ COMMITED : 커밋된 데이터 읽기
3. REPEATABLE READ : 반복 가능한 읽기 -> 동일한 트랜잭션 내에서는 동일한 결과
4. SERIALIZABLE : 직렬화 가능
val findMember1: Member = em.find(Member::class.java, 1L)
val findMember2: Member = em.find(Member::class.java, 1L)
val result = findMember1 == findMember2 // true
// EntityManager 생성
val em: EntityManager = emf.createEntityManager()
val tx: EntityTransaction = em.transaction
// 트랜잭션 시작 - 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 함
tx.begin()
// 객체 생성 - 비영속 상태
val member1: Member = Member(id = 1L, name = "member1")
val member2: Member = Member(id = 2L, name = "member2")
// 객체 저장 - 영속 상태
em.persist(member1)
em.persist(member2)
// 이때 DB에 Insert SQL를 수행
tx.commit()
// 객체 생성 - 비영속 상태
val member: Member = Member(id = 1L, name = "member1")
// 객체 저장 - 영속 상태
em.persist(member)
// Entity 조회
val findMember: Member = em.find(Member::class.java, 1L)
// Entity 수정
findMember.name = "member222"
// 호출할 필요가 없음
em.persist(findMember)
// Entity 조회
val findMember: Member = em.find(Member::class.java, 1L)
// Entity 삭제
em.remove(findMember)
영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 (동기화)
플러시는 트랜잭션이 커밋될 때 발생
-> 트랜잭션이라는 작업 단위가 중요
플러시는 변경 감지가 있을 때 발생하며, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 비우지 않음 -> 1차 캐시 데이터 유지
em.flushMode = FlushModeType.AUTO
FlushModeType
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 대 플러시 (기본값)
- FlushModeType.COMMIT : 커밋할 때만 플러시
영속 상태에서 준영속 상태로 변화
영속 상태 2가지
-> persist
-> find 해서 조회했을 때, 영속성 컨텍스트에 없는 경우
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(Detached)된 상태
영속성 컨텍스트가 제공하는 기능을 사용 못함