ParentId id1 = new ParentId();
id1.setId1("myId1");
id1.setId2("myId2");
ParentId id2 = new ParentId();
id2.setId1("myId1");
id2.setId2("myId2");
id1.equals(id2) ??????
id1.equals(id2) 의 결과값은 false이다.
왜냐하면 자바의 모든 클래스는 기본으로 Object 클래스를 상속받는데, 이 클래스가 제공하는 기본 equals()는 인스턴스 참조 값 비교인 ==비교(동일성비교)를 하기 때문이다.
영속성 컨테스트는 엔티티의 식별자를 키로 사용해서 엔티티를 관리한다.
그리고 식별자를 비교할 때 equals() 와 hashcode()를 사용한다.
따라서, 식별자 객체의 동등성(equals)이 지켜지지 않으면 예상과 다른 엔티티가 조회되거나 엔티티를 찾을 수 없는 등 영속성 컨텍스트가 엔티티를 관리하는 데 문제가 발생한다.
따라서 복합 키는 equals()와 hashCode()를 필수로 구현해야 한다.
* 응용 프로그램은 세션 당 단일 스레드를 고수하는 한 비즈니스 오브젝트에서 동기화 할 필요가 없습니다. 세션 내에서 응용 프로그램은 ==를 사용하여 객체를 안전하게 비교할 수 있습니다.
* equals와 hashcode를 어떨 때 사용하는가 ? -> 가장 이해하기 좋았던 사이트
https://jojoldu.tistory.com/134
해당 인스턴스들이 갖고 있는 값들이 같을 경우 같은 인스턴스로 봐야할 때 equals를 오버라이딩
equals와 hashcode는 모두 VO(value object)에서만 사용하길, 값 나타내는 것 이외에 기능을 갖는 인스턴스에서 오버라이딩을 하면 문제가 발생할 수 있음. 롬복 사용시 @EqualsAndHashCode(exclude = {"id", "paymentMethod", "price"}) 와 같은 형태로 클래스 명 위에 입력해주면 된다.
* 참고
-Book. 자바 ORM 표준 JPA 프로그래밍
'JPA & DB' 카테고리의 다른 글
Hikari Option 정리 (0) | 2022.03.25 |
---|---|
JPA 트랜잭션 격리수준 (Isolation Level) 과 락 (Lock) (0) | 2022.01.10 |
JPA Persistence Context 그리고.. Flush / Lazy Loading / N+1 Problem (0) | 2021.11.15 |
Cascade 이해 및 orphanRemoval=true vs CascadeType.REMOVE (0) | 2020.05.15 |
[JPA] OneToMany & multi OneToOne (0) | 2020.03.06 |