값타입은 아무래도 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 함.
예를 들면 테이블에서 같은 주소를 가지고 있으면 그건 같은 곳에 사는 거니까..
근데 임베디드 타입, 얘네들은 클래스기 때문에 == 했을 때 인스턴스의 주소를 비교하기 때문에..
내부의 값이 같다고 해도 다른 거라고 나옴.
그래서, 값타입 비교 시
동일성 비교 : 인스턴스의 참조를 비교, == 사용 과
동등성 비교 : 인스턴스의 값을 비교, equals() 등
이 둘을 구분해서 사용해야 함.
그래서, 값타입은 equals() 메소드를 재정의 해야 함.
거의 모든 필드를 지정해서 재정의 해야함.
참고로, equals() 자체의 기본이 ==비교라
재정의 해야 함.
보통 equals() 재정의 할 때는 자동으로 만들어 주는 거 쓰는게 좋음.
나는 alt + insert 해서 나오는 것 중에 equals() and hashcode() 선택하고 이거 했음.
그럼
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Address address = (Address) o;
return Objects.equals(city, address.city) && Objects.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
}
이렇게 나옴.
둘이 같은 인스턴스면 true를 반환,
인자로 온 오브젝트가 비어있거나 같은 종류의 클래스가 아니면 false 반환.
같은 클래스면 그 오브젝트를 같은 클래스로 형변환 한 다음에,
equals를 이용하여(기본이 ==) 다 비교.
근데 이러면 내부에 또 클래스가 있으면 어떻게 되는거지..?
여튼, 값타입끼리의 비교는 항상 equals()를 써야 함.
참고로 equals() 구현하면 hashcode()도 거기에 맞게 구현 해야 함.
그래야 hashmap 등 효율적으로 사용 가능.
임베디드 타입은
꼭 불변객체로 만들어야 한다.
꼭 equals()를 재정의 해 줘야 한다.
'JPA > JPA 기본' 카테고리의 다른 글
36. 값타입 실전 (0) | 2023.10.30 |
---|---|
35. 값타입 컬렉션 (0) | 2023.10.29 |
33. 값타입과 불변 객체 (0) | 2023.10.29 |
32. 임베디드 타입 (0) | 2023.10.29 |
31. 기본값 타입 (0) | 2023.10.29 |