영속 클래스

Hibernate 2008.01.18 18:01
영속클래스는 애플리케이션내에서 비즈니스 엔티티를 구현하는 클래스 입니다.
영속클래스는 POJO 이며 몇가지 규칙이 있습니다.

기본 생성자 제공
모든 영속클래스는 Hibernate의 Constructor.newInstace() 메서드를 이용해 인스턴스화 되므로 패키지 접근
이상의 생성자를 가져야 합니다.

identifier 프로퍼티 제공(옵션)
데이터베이스 테이블의 주키와 매핑되는 식별자 프로퍼티는 반드시 존재할 필요는 없습니다.
만약 식별자 프로퍼티가 없을 경우 Hibernate는 내부적으로 데이터베이스 테이블의 주키와 자바객체를 매핑
해줍니다. 하지만 권장되는 방법은 아닙니다.
아래 3가지 경우 식별자 프로퍼티는 반드시 제공되어야 합니다.
- detached 객체를 update 또는 merge를 사용하여 영속화 할 때
- Session.saveOrUpdate()
- Session.merge()

final이 아닌 클래스(옵션)
Hibernate는 늦은로딩을 위해 Proxy 객체를 생성하는데 final 클래스일 경우 Proxy를 생성 할 수 없습니다.
같은 이유로 메서드역시 final 메서드여선 안됩니다. 만약 final 메서드를 가진 클래스를 사용하려면
lazy="false" 를 설정함으로써 명시적으로 Proxy 생성을 방지해야 합니다.

영속 필드를 위한 accessor 선언(옵션)
Hibernate는 디폴트로 자바빈 스타일의 프로퍼티를 영속화 하고 get/set 쌍으로된 메서드를 인식합니다.
하지만 accessor가 없더라고 필드에 직접 접근할 수 있습니다.

상속
서브클래스는 첫번째와 두번째 규칙이 적용 됩니다.

equals() 와 hashCode() 구현
다음의 경우 equals() 와 hashCode() 메서드는 반드시 오버라이드 해야 합니다.
- 영속 객체를 Set에 저장할 때
- detached 객체를 영속화 할 때
Hibernate는 하나의 Session 내에서만 테이블의 식별자와 자바 객체의 식별자가 동일함을 보장합니다.
만약 다른 Session 에서 같은 식별자를 가진 객체를 검색하더라도 객체의 참조값이 다르기 때문에 서로 다른 객체로 인식됩니다. 따라서 다른 Sesion 에서 검색된 객체일지라도 같은 객체로 인식하기 위해 equals() 와
hashCode() 메서드를 오버라이드 합니다. 두 메서드를 오버라이드 하는방법은 다음과 같습니다.
- 식별자 비교
- 비즈니스키 비교
식별자 비교의 경우 가장 명백한 방법이지만 아직 데이터베이스에 저장되지 않은 상태라면 식별값이 없으므로
비교를 할 수 없다는 문제가 있습니다. 식별자로 비교하는것 보다 비즈니스키로 비교하는것을 권장합니다.
비즈니스키란 논리적으로 유일한 필드의 조합을 뜻합니다. 비즈니스키를 이용한 예제 입니다.
public boolean equals(Object other) {
   
if (this == other) return true;
   
if ( !(other instanceof Cat) ) return false;
   

    final Cat cat = (Cat) other;
   
    if ( !cat.getLitterId().equals( getLitterId() ) ) return false;
   
if ( !cat.getMother().equals( getMother() ) ) return false;
   
   
return true;
}

'Hibernate' 카테고리의 다른 글

Hibernate에서 HSQL 사용과 스키마 자동 생성  (0) 2008.02.05
Hibernate 기본 매핑 설정  (0) 2008.01.23
영속 클래스  (0) 2008.01.18
Hibernate 설정  (0) 2008.01.18
Hibernate 간단한 예제2  (2) 2008.01.17
Hibernate 간단한 예제  (1) 2008.01.17
Posted by 째코

댓글을 달아 주세요