一对多关联 - 在JPA中连接具有非主键列的表

时间:2012-12-14 20:38:43

标签: hibernate jpa one-to-many hibernate-onetomany

我正在研究遗留系统,需要从数据库中读取一些信息。以下是表格关系

供应商(vendorId - pk,vendorEid,name)
  VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
  联系(contactId -pk,contactEid,电话)

vendorEid和contactEid不是表的主键,而是用作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无法引用非主键。

我删除了我在Vendor实体中提供的Eager fetch,我没有得到任何异常,但它没有加载该集合。关联有什么问题?

2 个答案:

答案 0 :(得分:10)

根据第379页的JPA 2.0 specs段11.1.21 JoinColumn注释

  

支持不是主键列的引用列   引用表是可选的。使用这种映射的应用程序将会   不可携带。

看来Hibernate选择不实现这个可选部分。其他实现可能。我在EclipseLink上尝试了它,但是它也不起作用(它验证失败)。

我看到两个工作。一种是调整模式以使用主键,从数据库设计理论的角度来看,这是正确的。然而,这可能不是一个选项,因为其他软件取决于这个模式留下选项二。通过NOT修改JPA中的关系来解决它只需使用eid并自己检索相关对象。

答案 1 :(得分:1)

我找到了解决此问题的方法。

见这里: