2017-05-17 17 views
0

Hibernate: Where do insertable = false, updatable = false belong in composite primary key constellations involving foreign keys?에 대한 후속 질문입니다 이유 :JPA : 관계 매핑 대 간단한 중복 - 어디에 삽입 = false를 갱신 = false를 넣어

는 다음 엔티티 매핑을 고려

public class Zip { 

    @ManyToOne 
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code") 
    private Country country = null 

    @Column(name = "country_code") 
    private String countryCode; 

    ... 
} 

처럼 이 JPA 구현은 "country_code에 대한 중복 매핑과 같은 것을 말하며, 그 중 하나만 쓰기 가능으로 지정할 수 있습니다".

Q :

왜 일반적 퍼팅 위에/여기 바람직 읽기 전용 (private Country country을)를 관계를 결정하는 읽기 전용 간단한 ID 필드 (private String countryCode)에?

실제로 다른 편보다 나은 점은 무엇입니까 (찬성/반대)?

내가 생각할 수있는 유일한 일

는 DB 다소 필수, 그러나,이 할 수있는 못하도록하지 않을 단체와 협력 할 것 어떤 FKS를 사용 하지, 때 쓰기 가능한 관계로 작업하는 것이 더 나은 것입니다 ID를 알 수없는 DB에 새 엔티티를 삽입하면 쓰기 가능한 관계가 약간 더 안전 해집니다. 물론 ID로 작업 할 수 있다면 DB에서 전체 엔티티를 로딩하는 것이 큰 성능 측면이 될 수 있습니다.

더 많은 논의가 환영합니다.

추신 : 더 많은 잠재 고객을 확보하기 위해 JPA 구현을 태그로 추가했습니다.

답변

2

첫 번째로 iso_code에 대한 매핑 내에서 countryCode 매핑이 참조 된 국가에 보관되므로 실제 매핑이 필요하지 않습니다. 예를 들어, EclipseLink는 쿼리에서 zip.country.id = :isoCode을 사용할 수 있으며 zip.countryCode = :isoCode을 사용한 경우와 같이 테이블에 조인하지 않고 country_code 외래 키를 직접 사용할 수 있음을 알 수 있습니다. 그래서 둘 다 가지고 있다면, 이유가 있어야하고 외래 키 country_code을 제어하고자하는 이유가 있어야합니다.

둘째, 데이터베이스에 외래 키 제약 조건이없는 경우 관계를 유지하는 것이 도움이되지 않습니다. 제약없이 데이터베이스에서 국가를 제거하면 Zip은 여전히 ​​해당 국가를 참조합니다. 캐시에없는 경우 countryCode은 값을 갖지만 참조는 null입니다 (또는 제공자에 따라 오류가 발생합니다).

또한 관계가 읽기 전용이어야한다는 데 동의하지 않습니다. 나는 이것이 IMO가 나쁜 관행 인 참조 된 객체를 읽을 필요없이 데이터베이스에서 관계가 변경 될 가능성이 높다고 생각한다. JPA는 2 단계의 캐싱을 허용하므로 변경으로 인해 캐시 된 관계가 데이터베이스와 동기화되지 않게되고 해결하기 위해 추가 오버 헤드가 필요합니다. 이 작업을 수행하려는 경우 country 관계 참조를 전혀 매핑하지 않아도됩니다. 필요하면 JPA에서 읽고 관계가있는 경우 엔티티에 임시 저장소로 저장하십시오.

결국 개체 모델은 비즈니스 요구 사항을 매핑해야합니다. 데이터베이스에 참조와 필드가 있기 때문에 Java 엔터티가 모두 똑같은 방식으로 매핑해야한다는 의미는 아닙니다.