[JPA] Entity equals() & hashCode() Override 시 주의할 점

JPA Entity의 equals()와 hashCode()를 IDE(ex. IntelliJ)로 기본 자동 생성할때 아래와 같이 getClass()로 비교되는 것으로 생성된다.

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    private String name;

    ....

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User u = (User) o;

        return id != null ? id.equals(u.id) : u.id == null;
    }
}

그러나 위의 equals() 코드는 Fetch 전략을 lazy로 했을때 Proxy로 인한 문제가 발생한다.
lazy fetch는 해당 entity를 상속하는 Proxy 객체를 반환하기 때문에 getClass()가 User 객체가 될수 없어 equals 비교가 실패하게 된다.

해결책은 아래와 같이 instanceof로 override 해주는 것.
또한 id 필드가 private 임으로 proxy에서 getter를 사용해서 접근하는 것도 눈여겨 볼만 하다.

    ....

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;

        User u = (User) o;

        return Objects.equals(getId());
}

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명