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와 hashCode 사용하기 ( +lombok)

안녕하세요? 이번 시간엔 equasl & hashcode를 어떤 곳에서 사용할 수 있는지를 확인해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 G..

jojoldu.tistory.com

해당 인스턴스들이 갖고 있는 값들이 같을 경우 같은 인스턴스로 봐야할 때 equals를 오버라이딩

equals와 hashcode는 모두 VO(value object)에서만 사용하길, 값 나타내는 것 이외에 기능을 갖는 인스턴스에서 오버라이딩을 하면 문제가 발생할 수 있음. 롬복 사용시  @EqualsAndHashCode(exclude = {"id", "paymentMethod", "price"}) 와 같은 형태로 클래스 명 위에 입력해주면 된다. 

 

* 참고

-Book. 자바 ORM 표준 JPA 프로그래밍

-https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html

 

4.3. Implementing equals() and hashCode()

4.3. Implementing equals() and hashCode() You have to override the equals() and hashCode() methods if you intend to put instances of persistent classes in a Set (the recommended way to represent many-valued associations) and intend to use reattachment of d

docs.jboss.org

https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/transactions.html#transactions-basics-identity

+ Recent posts