2014-02-07 4 views
1

모든 JPA 도메인 엔티티에 BaseDomain 클래스를 사용하고 싶습니다. 기본 클래스에서 UUID.random()에서 생성 된 String으로 저장된 객체 ID가 있습니다. 오브젝트 ID는 오브젝트 작성시 지정됩니다. 엔티티 클래스는 또한 유지 될 때 데이터베이스에 의해 할당 된 기본 키를 가지고 있습니다.JPA 엔티티에서 객체 ID로 제공되는 임의의 UUID를 처리 하시겠습니까?

이 시점까지는 항상 String 기반 개체 ID를 유지했습니다. 이렇게하면 각 테이블에 추가 열이 추가되지만 걱정하지 않아도됩니다.

궁금한데요 - 개체 ID (생성 된 UUID)를 유지할 이유가 있습니까? 또는 임의의 UUID가 Java 공간에 있어야합니까?

저는 항상 기본 키가 아닌 UUID에서 내 도메인 클래스 hashCode() 및 equals() 메소드를 기반으로합니다. 이것은 UUID가 JVM과 데이터베이스 모두에서 전체 엔티티에 대해 동일하게 유지되기 때문에 문제가되지 않습니다.

UUID의 지속을 중단하면 hashCode() 및 equals() 메소드는 어떻게 생겼을까요? 그것은 기본 키가 null 인 경우 객체 ID를 사용하여 null이 아닌 경우 기본 키를 먼저 사용하여 2 단계 비교와 같을까요?

+0

UUID를 기본 키로 사용하지 않는 이유는 무엇입니까? –

답변

1

적절한 구현 인 equalshashCode은 엔티티에서 상당히 중요한 문제입니다.

개인의 주민 등록 번호와 같은 '기본'기본 키가있는 경우 추가 비즈니스 키 값을 유지할 필요가 없습니다. 이름, 성, 생년월일 및 주소의 조합과 같은 단일 값 또는 값 조합 일 수 있습니다. 그러한 자연의 PK를 가지고 있다면 그것을 사용하십시오. 당신이 그것을 가지고 있지 않다면, UUID를 사용하는 것이 좋은 방법이다.

equalshashCode에 대해 UUID를 사용하는 경우에도 동일한 레코드의 두 인스턴스가 동일하게 간주되도록 유지해야합니다.

equalshashCode은 DB 제공 ID가 아닌이 비즈니스 키를 기반으로해야합니다. DB 제공 ID를 사용하는 경우 모든 새 엔터티는 동일한 것으로 간주됩니다. 이로 인해 예기치 않은 동작이 발생할 수 있습니다 (특히 Collections를 사용하는 경우).

관련 문제