Whiteship's Note


The problem of identity

Hibernate/study : 2007.02.16 12:27


참조 : Java Persistence With Hibernate

Java에는 두 가지의 동일성에 대한 표현[각주:1]이 있고 DB에서의 row에 대한 identity는 주키로 나타내기 때문에 발생하는 문제 입니다.[각주:2]

9.2.2에 보시면 equals()와 hashCode()를 구현할 때 주의할 것들이 나옵니다.
  • equals()와 hashCode()를 테이블의 주키 값의 동일성으로 구현을 하면 transient 객체의 동일성 비교를 할 때 아직 id가 없는 상태이기 때문에 문제가 발생하며..
  • equlas()와 hashCode()를 테이블의 주키를 제외한 다른 모든 속성들의 값으로 구현을 하면 같은 row인데 속성하나가 바꼈다고 다른 row로 인식하거나.. 다른 row인데 값이 같다고 해서 같은 객체로 인식하는 문제가 발생합니다.
  • 그래서 business key를 사용하라는 내용이 있었습니다. 주키는 surrogate key를 사용하는데 둘다 유일한 값을 가지며 차이가 있다면 business key는 어떤 의미가 있는 값(ex. 학번, 주민번호)이 지만 surrogate key는 아무런 의미가 없이 DB에서 식별자 역할 만 한다는 겁니다.
주키를 정할 때 surrogate key로 정하는데 DB를에 row 식별을 위해 만든 속성을 domain model에 표현을 해야하는 건지..? 라는 질문을 던지고 있습니다. 여기에 대해서는 p162쪽 4.2.2에 보시면 Hibernate는 db identity를 application에서 두 가지 방법으로 표현할 수 있다고 합니다.
  • persistence 객체의 식별자 속성의 값으로
  • Session.getIdentifier(Object entity)의 리턴값으로
  1. Equality를 나타내는 equals()와 Object identity를 나타내는 == 이 있습니다. [본문으로]
  2. 단순히 동일성 표현 방법의 갯수가 차이 나서 그런 것은 아닙니다. [본문으로]

'Hibernate > study' 카테고리의 다른 글

Convention over Configuration  (0) 2007.03.02
숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
top


Object identity

Hibernate/study : 2007.01.01 17:44


참조 : Hibernate In Action 3.4. Understanding object identity

■ Object identity : == 으로 확인하며 객체가 메모리에 같은 위치에 있다.

■ Object equality : equals(Object o)로 확인하며 객체가 가지고 있는 속성들의 값이 같다. Object class의 equals(Obejct o)메소드는 Object identity를 확인하기 때문에 overriding하여 사용해야 한다. (String class는 값을 비교하도록 overriding 되어있습니다.)

Database identity : 관계형 DB에 저장되어 있는 객체들이 같은 테이블에 있고 주키 값이 같으면 같은 row이며 동등하다.


하이버네이트에서 DB에 있는 주키를 가져오는 방법으로 public 게터를 사용하고 주키의 값이 바뀌면 안되기 때문에 private 쎄터를 사용한다.

public class Category {
private Long id;
...
    public Long getId() {
    return this.id;
    }
    private void setId(Long id) {
    this.id = id;
      }
  ...
}

주키(primary key) 선택 조건 세가지
■ The value or values are never null.
■ Each row has a unique value or values.
■ The value or values of a particular row never change.

후보키(cadidate key) = 주키가 될 수 있는 식별자들.(유일 한 값들)

natural primary key = 주키에 비즈니스 의미가 포함되어 있는 키. 주민등록번호 중 두번째 단어의 첫 숫자는 성별을 나타낸다.(하리수의 경우 이 수가 변하는데 이때 주키의 조건 중 세번 째 것을 위반하게 됩니다.)

surrogate key(synthetic identifiers) = 아무 의미가 담겨져 있지 않은 주키. 이걸 쓰는 것을 강추하며 하이버네이트에 미리 만들어 놓은 다음과 같은 것들이 있다.
사용자 삽입 이미지
이중에서 예제에서는 sequence를 사용했었습니다.


'Hibernate > study' 카테고리의 다른 글

객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
Transient Object  (0) 2006.12.28
JPA를 필드 위에 써보기  (0) 2006.12.28
@Column 조사  (2) 2006.12.28
top