10

I'm working on legacy system, need to read some of the info from database. Below are the table relationship

Vendor (vendorId - pk, vendorEid, name)
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
Contact (contactId -pk, contactEid, phone)

vendorEid and contactEid are not the primary key of the table but used as join column in Join table VendorContactBridge.

Vendor Entity -

@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;
}

Contact Entity -

@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;
 }

while running the query, getting below exception

SecondaryTable JoinColumn cannot reference a non primary key.

I removed the Eager fetch which i have given in Vendor entity, i dont get any exception but it doesn't load the collection. What's wrong with association ?

4

2 に答える 2

11

JPA 2.0 仕様の段落 11.1.21によると、 379 ページの JoinColumn アノテーション

参照されるテーブルの主キー列ではない参照される列のサポートはオプションです。このようなマッピングを使用するアプリケーションは移植できません。

Hibernate は、このオプションの部分を実装しないことを選択したようです。他の実装では可能性があります。EclipseLink で試してみましたが、どちらも機能しません (検証に失敗します)。

2 つの回避策があります。1 つは、スキーマを調整して主キーを使用することです。これは、データベース設計理論の観点から正しいことです。ただし、このスキーマに依存する他のソフトウェアがオプション 2 を残すため、これはオプションではない可能性があります。JPAでリレーションシップを改造せずに、eidを使用して関連するオブジェクトを自分で取得することで回避してください。

于 2012-12-16T08:41:09.743 に答える
1

この問題の回避策を見つけました。

ここを参照してください:

于 2014-06-03T13:20:33.523 に答える