一对多关联 - 加入与JPA非主键列的表(One to many association - Joi

2019-07-05 08:27发布

我正在原有系统上,需要阅读一些从数据库中的信息的。 下面是表关系

供应商(厂商ID - PK,vendorEid,名)
VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
联系(使用ContactID -pk,contactEid,电话)

vendorEid和contactEid不是表的主键,但作为加入加入表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不能引用非主键。

我删除了预先抓取我在供应商实体给了,我没有得到任何异常,但它不会加载集合。 这有什么错的关联?

Answer 1:

按照JPA 2.0规格 379页第11.1.21 JoinColumn annotaion

为引用的列不在引用的表的主键列支持是可选的。 使用这样的映射应用程序将不可移植。

这似乎休眠选择不执行此可选部分。 其他实现可能。 我想它的EclipseLink,但一个不工作,要么(验证失败)。

我看到两个变通。 一是要调整你的架构使用的主键这将是从数据库设计理论的角度正确的事情。 但是这可能不是一个选项,因为取决于该模式留下选择其他两个软件。 它周围的工作由不moddeling在JPA的关系只是使用EID的和自己检索相关的对象。



Answer 2:

我发现这个问题的方法。

看这里:

  • https://stackoverflow.com/a/4525951/527718


文章来源: One to many association - Join tables with non primary key column in JPA