Hibernate equals 와 hashCode

Hibernate 는 서로 다른 시간 에 얻 은 데이터 대상 을 보장 하지 않 습 니 다. 메모리 의 같은 위치 에 참고 할 지 여부 입 니 다. = = 을 사용 하여 두 대상 의 데이터 가 데이터베이스 의 같은 데 이 터 를 대표 하 는 지 비교 하 는 것 은 불가능 합 니 다. Object 가 미리 설정 한 equals () 자체 가 비교 대상 의 메모리 참고 입 니 다. 조회 후 두 대상 의 데이터 가 같은 지 비교 할 필요 가 있 습 니 다.(예 를 들 어 대상 이 Set 에 저 장 될 때) equals () 와 hashCode () 를 실제로 만들어 야 합 니 다. 하나의 실제 equals () 와 hashCode () 의 방법 은 데이터 뱅 크 의 idenity 에 따라 하 는 것 입 니 다. 하나의 방법 은 getId () 방법 으로 대상 의 id 값 을 얻 고 비교 하 는 것 입 니 다. 예 를 들 어 id 의 형태 가 String 이면 실제 적 인 예 는 다음 과 같 습 니 다. User. java
public class User { 
            ……
        public boolean equals(Object o) {
            if(this == o) return true; 
            if(id == null || !(o instanceof User)) return false; 
            final User user == (User) o; return this.id.equals(user.getId()); 
        } 
        
        public int hasCode() { 
            return id == null ? System.identityHashCode(this) : id.hashcode();
        } 
    }

이 예 는 Hibernate in Action 123 페이지 의 범례 에서 나 온 것 이지 만 격려 되 지 않 는 예 입 니 다. 대상 이 new 로 나 와 save () 가 없 을 때 id 값 이 부여 되 지 않 기 때문에 이 방법 은 적용 되 지 않 습 니 다. 비교적 사용 되 는 방법 은 대상 에 진정 으로 포 함 된 속성 값 에 따라 비교 하 는 것 이다. 참고 수첩 에서 예 를 들 어 Cat. 자바
public class Cat { 
        ... 
        public boolean equals(Object other) { 
            if (this == other) return true; 
            if (!(other instanceof Cat)) return false; 
            final Cat cat = (Cat) other; 
            if (!getName().equals(cat.getName())) return false; 
            if (!getBirthday().equals(cat.getBirthday())) return false;
            return true; 
        } 
        
        public int hashCode() {
            int result; 
            result = getName().hashCode(); 
            result = 29 * result + getBirthday().hashCode(); return result;
        }
    }

    저 희 는 더 이상 id 속성 을 간단하게 비교 하지 않 습 니 다. 이것 은 비 즈 니스 키 (business key) 에 따라 equals () 와 hasCode () 를 만 드 는 예 입 니 다. 물론 남 은 문 제 는 귀하 가 실제 작업 할 때 관련 비 즈 니스 키 를 어떻게 이용 하 느 냐 하 는 것 입 니 다. 이것 은 귀하 의 실제 비 즈 니스 수요 에 따라 결정 해 야 합 니 다.

좋은 웹페이지 즐겨찾기