Hibernate의 Entity Lifecycle
2024. 5. 8. 20:39ㆍSpring Data/Hibernate
반응형
들어가며
Hibernate를 사용하면 객체를 생성하여 DB에 데이터를 저장하거나, DB에 들어 있는 데이터를 조회할 수 있다.
이를 엔티티(영속성 객체)라 하는데, 이 엔티티는 DB에 연결되어 있는 라이프사이클동안 여러 단계를 거친다.
Hibernate에서 정의하는 엔티티의 상태는 다음과 같다.
- Transient State
- Persistent State
- Detached State
- Removed State
State 1 : Transient State
- Transient State는 엔티티 객체의 첫 번째 상태로, new 키워드를 통해 객체가 새로 생성된 POJO(Plain Old Java Object)이다.
- Transient State에서 엔티티 객체는 Hibernate 세션에 연결되어 있지 않다. 즉, DB에 연결되어 있지 않다.
- 엔티티 객체에 수정이 일어나도, DB 데이터는 변화하지 않는다.
- 힙 메모리(Heap Memory)에 존재하고 있다.
- 어플리케이션에서 객체가 생성되었으나 세션에 연결되지 않은 경우나
- 객체가 닫힌 세션에서 생성된 경우이다.
Employee e = new Employee();
e.setId(1);
e.setFirstName("Gigyesik");
State 2 : Persistent State
- 엔티티 객체가 Hibernate 세션에 연결되고 나면 그 객체는 Persistent State로 변화한다.
- Hibernate 세션을 사용하여 엔티티 객체를 저장하는 경우
- Hibernate 세션을 사용하여 엔티티 객체를 조회하는 경우
- 엔티티 객체 하나는 DB 테이블의 row 하나를 의미한다. 즉, 엔티티 객체에 수정이 일어나면 DB에도 수정이 일어난다.
- 사용 가능한 메서드는 아래와 같다.
- session.persist(e);
- session.save(e);
- session.saveOrUpdate(e);
- session.update(e);
- session.merge(e);
- session.lock(e);
// Transient State
Employee e = new Employee("Gigyesik");
//Persistent State
session.save(e);
State 3 : Detached State
- Persistent State 객체를 Detached State로 바꾸기 위해서는 세션을 닫거나 캐시를 비워야 한다.
- 세션이 닫히거나 캐시가 클리어되면 엔티티 객체에 수정이 일어나도 DB 데이터에는 영향을 주지 않는다.
- 언제든 아래 메서드를 사용하여 새로운 세션에 연결해 Persistent State로 돌아갈 수 있다.
- merge()
- update()
- load()
- refresh()
- save()
- update()
- Detached State에서 사용할 수 있는 메서드는 아래와 같다.
- session.detach(e);
- session.evict(e);
- session.clear();
- session.close();
// Transient State
Employee e = new Employee("Gigyesik");
// Persistent State
session.save(e);
// Detached State
session.close();
State 4 : Removed State
- Hibernate의 엔티티 Lifecycle 중 마지막 상태이다.
- 엔티티 객체가 DB에서 삭제되어 있는 경우이다.
- session.delete() 메서드를 통해 사용할 수 있다.
- DB에 데이터가 존재하지 않으므로 엔티티 객체가 수정되어도 DB에 반영되지 않는다.
Employee e = new Employee();
Session s = sessionfactory.openSession();
e.setId(1);
// Persistent State
session.save(e)
// Removed State
session.delete(e);
Resources
반응형
'Spring Data > Hibernate' 카테고리의 다른 글
Hibernate의 참조 관계 설정(Referential Relationship Mapping) (0) | 2024.05.08 |
---|---|
Hibernate와 Transaction 관리 (0) | 2024.05.03 |
Spring Boot와 Hibernate (0) | 2024.05.02 |