일요일, 11월 12, 2006

Hibernate Persistance status

예전에 공부하면서 정리해 둔 내용..

1.1. The persistence Lifecycle

1.1.1. Transient Objects
일반 자바 instance로 Database table의 row와 아무런 관련이 없다.
다른 객체가 더 이상 이 객체를 참조하지 않는다면 garbage collection 에 의해 소멸된다.
Hibernate 에선 모든 transient object를 non-transaction 상태로 다룬다. 따라서 이 객체의 상태 변화는 transaction context와 무관하다. 또 이 객체에 대한 rollback 기능도 제공되지 않는다.

이 transient 객체가 영속성을 가지려면 persistence manager에서 save() 가 호출하거나, 이미 persistent 상태에 있는 인스턴스로부터 참조를 생성해야 한다.

1.1.2. Persistent Objects
Persistent 인스턴스는 database 의 식별자인 primary key 값을 가지는 아무 인스턴스이다.
Persistent 인스턴스란 application 에서 객체가 인스턴스화 된 다음, persistent manager(session )의 save() 메소드 호출에 의해 영속성을 가지게 된다.
또, 이미 persistent manger와 연관된 다른 persistent 객체로부터 참조가 생성된 객체도 영속성을 가지게 된다.

Persistent 인스턴스는 transaction에 참여되고, 그 인스턴스의 상태는 트랜잭션의 끝에서 database와 동기화 된다.
트랜잭션이 commit 되면, 메모리에 보관된 상태는 sql 명령문 insert, update, delete 이 수행되어 database에 전달된다. à 이것은 session.close()가 호출될 때 수행된다.

1.1.3. Detached Objects
트랜잭션이 완료될 때, Transaction manager와 관련된 persistent 인스턴스는 여전히 존재한다. 다시 말해 session.close() 가 호출될 때 더 이상 이 인스턴스는 persistent 상태가 아니지만, 여전히 그 인스턴스의 상태를 참조할 수 있는데 이러한 상태를 detached 상태라 한다.
이 상태에서는 더 이상 database와 동기화가 수행되지 않는다. (hibernate의 관리를 받지 않는다)

1.1.4. Implementing equals() and hashCode()
.Object identifier Vs database identifier
.가장 좋은 해결책 à business key(surrogate) 대리 키를 사용한다.
왜냐면, 집합 내에서 유일해야 하면, 또한 이 키의 변경이 자주 일어나지 않는 게 좋다.

1.2. The persistence manager

1.3. Using transitive persistence in Hibernate
1.3.1. Cascading persistence with Hibernate
Hibernate는 cascade 스타일을 각 association mapping 에 명시할 수 있다.
이렇게 선언된 cascade 스타일을 읽고, association 된 객체의 cascade를 자동으로 수행한다.
각 객체 mapping 에 이 cascade 스타일을 따로 지정할 수 있다.

기본적으로 hibernate는 transient, detached 인스턴스와 관련은 cascade를 사용하지 않는다.
- cascade=”none” à 기본값으로 association을 무시한다.
- Cascade=”save-update” à save(), update() 와 관련된 트랜잭션이 완료될 때 association을 탐색한다.
- Cascade=”delete” à delete() 수행 될 때, persistent를 삭제하고 관련된 객체를 탐색한다.
- Cascade=”all” à save-update, delete를 포함하고, evict(), lock()이 호출될 때 도 수행.
- Cascade=”all-delete-orphan” à all과 같고, 추가로 관계가 삭제된 persistent entity도 함께 삭제
- Cascade=”delete-orphan” à 연관관계가 삭제된 아무 persistent entity 는 삭제한다.