2012-12-14 1 views
7

저는 기존 시스템에서 작업 중이며 데이터베이스에서 정보 일부를 읽을 필요가 있습니다.
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
연락 (contactId의의 -pk, contactEid, 전화)일대 다 연관 - JPA에서 비 기본 키 열이있는 테이블을 결합하십시오.

vendorEid 및 contactEid - 아래 테이블 관계를

공급 업체 (PK, vendorEid, 이름 VendorID 값)입니다 테이블의 기본 키가 아니며 Join 테이블 VendorContactBridge의 조인 열로 사용됩니다.

공급 업체 엔티티 -

@Entity 
@Table(name="Vendor") 
public class Vendor implements Serializable{ 

@Id 
@Column(name="VENDORID") 
private BigDecimal vendorId; 

@Column(name="VENDOREID") 
private BigDecimal vendorEid; 

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}, 
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")}) 
private Set<Contact> vendorContact; 
} 

연락 엔티티 -

@Entity 
@Table(name="CONTACT") 
public class Contact implements Serializable{ 

@Id 
@Column(name="CONTACTID") 
private BigDecimal contactId; 

@Column(name="CONTATEID") 
private BigDecimal contactEId; 

@ManyToOne 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")}, 
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}) 
private Vendor vendor; 
} 

SecondaryTable JoinColumn가 아닌 기본 키를 참조 할 수 없습니다 예외 이하지고, 쿼리를 실행하는 동안.

나는 공급 업체 엔티티에서 지정한 Eager 가져 오기를 제거했는데 예외는 없지만 컬렉션을로드하지는 않습니다. 연관성에있어 잘못된 점은 무엇입니까?

답변

10

페이지에 JPA 2.0 specs 단락 11.1.21 JoinColumn의 annotaion에 따르면 참조 된 테이블의 기본 키 열 수없는 참조 열에 대한 379

지원은 선택 사항입니다. 이러한 매핑을 사용하는 응용 프로그램은 휴대 할 수 없으므로 입니다.

Hibernate는이 선택적 부분을 구현하지 않기로 선택합니다. 다른 구현이 가능할 수 있습니다. 내가 EclipseLink에서 시도했지만 그 중 하나 (검증에 실패) 작동하지 않습니다.

두 가지 해결 방법이 있습니다. 하나는 데이터베이스 설계 이론 관점에서 올바른 것이 될 기본 키를 사용하도록 스키마를 조정하는 것입니다. 그러나 옵션 2를 유지하는이 스키마에 따라 다른 소프트웨어 때문에 옵션이 될 수 없습니다. JPA에서 관계를 moddeling하지 않고 그것을 해결하려면 eid를 사용하고 관련 객체를 직접 검색하십시오.

+0

옵션 2 : 당신은 의미합니까, 내가 연락이 ContactEid에 ased에 VendorEid과 다시에 따라 VendorContactBridge에서 ContactEid를 얻기 위해 하나를 호출 DB를 두를 수 있도록해야합니까? 내 이해가 맞습니까? – Pankaj

+0

기본 교장이됩니다. 그러나 조인을 할 수있는 것처럼 기본 쿼리를 사용하는 것이 가장 좋을 것이므로 단일 SQL 쿼리를 사용하여 개체를 검색 할 수 있습니다. – Eelke