2016-09-28 5 views
0

ID가 주석 처리 된 엔티티가 2 개 있지만 테이블의 기본 키가 아닌 엔티티가 있습니다. 나는 여전히 변경 사항의 초기 영향을 제한하기 위해 PK의 엔티티를 엔티티에 매핑하고 있습니다. 그러나 PK의 많은 관계로 많은 연결하는 데 사용하는 연결 테이블은 다음과 같은 오류를 던지고있다 :Hibernate 연관 테이블

java.lang.IllegalArgumentException: Provided id of the wrong type for class. Expected: class java.util.UUID, got class java.lang.Long 

@Id는 UUID하지만 @JoinColumn

로 매핑되는 긴 인 테이블 PK하는 엔티티

연관 엔티티

@Embeddable 
public class CustomerAccountId implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "user_id", nullable = false) 
    private Long customerId; 

    @Column(name = "account_id", nullable = false) 
    private Long accountId; 

의 복합 키 연관 엔티티 :

@EmbeddedId 
@AttributeOverrides({ 
    @AttributeOverride(name = "customerId", column = @Column(name = "user_id", nullable = false)), 
    @AttributeOverride(name = "accountId", column = @Column(name = "account_id", nullable = false)) 
}) 
private CustomerAccountId id; 

@ManyToOne 
@JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id") 
private Customer customer; 

@ManyToOne 
@JoinColumn(name = "account_id", insertable = false, updatable = false, referencedColumnName = "id") 
private Account account; 
,

실패한 기업이 심지어 가능한 경우

@Column(name = "user_id") 
private Long serialId; // also the primary key in the table 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@org.hibernate.annotations.Type(type="pg-uuid") 
@Column(name = "uid", updatable = false) 
private UUID id; 

사람이 알고 있나요? 또는이 변경을 푸시 할 때 연관 테이블의 콘텐츠를 강제로 업데이트해야합니까?

답변

0
  • 테이블 데이터를 나타내는 필드 다음 긴 (표) 엉 긴 (sgbd)를 매핑합니다 최대 절전 모드

또는

  • 에 @Id 및 @GeneratedValue을 넣어 당신 (sgbd) 테이블 데이터 유형은 (java) uuid 유형과 호환 가능해야합니다.

왜 테이블에이 두 개의 키가 있습니까?

한 엔티티에 대해 2PK를 가질 수 없다고 생각합니다. 대부분 직렬 ID와 UUID에 합성 키 기반을 설정할 수 있습니다.

은 @Id로 그

또는 마크 SGBD에서 실제 PK에 대한 How to map a composite key with Hibernate?을 참조하십시오. 간단히 말해서

@ManyToOne 
@JoinColumns (value = { 
    @JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id"), 
    @JoinColumn(name = "user_uid", insertable = false, updatable = false, referencedColumnName = "uid") 
}) 
private Customer customer; 

단순히 협회 테이블에 UUID를 추가 :

+0

직렬 ID 열을 보안 위험으로 노출시키고 PK로 UUID를 사용하여 성능이 저하되는 것을 피하기 위해 일련 ID를 PK로 유지하려고했습니다. 직렬 ID는 여전히 엔티티에 매핑되므로 단계별로 작업을 수행 할 수 있지만이 엔티티 ID가되고 싶지는 않습니다. – peekay

+0

정확하게 이해한다면 ID 수정을 허용하지 않으시겠습니까? 참조 http://stackoverflow.com/a/2217064/2710704 – Tokazio

+0

원래 순차적 ID를 사용했습니다.이제 보안 감사를 마친 후 UUID로 변환 중이지만 잠재적 인 성능 문제로 인해 UUID를 PK로 사용하고 싶지 않습니다. – peekay

0

내가 함께 가기로 결정 솔루션보기의 테이블의 관점에서 고전적인 값으로 자바의 다른를 사용하면 다음과 같다 Customer Entity에 대해 두 열을 모두 사용했습니다.

@ Tokazio의 UUID 및 일련 ID 사용에 관한 질문을 해결하기 위해 데이터웨어 하우스 변환이 크게 영향을 받으므로 영향을 최소화하고 중단을 방지하기 위해 직렬 ID에서 UUID로 천천히 이동해야합니다.

관련 문제