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

Pan*_*kaj 9 hibernate jpa one-to-many hibernate-onetomany

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

联系实体 -

@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;
 }
Run Code Online (Sandbox Code Playgroud)

在运行查询时,获得以下异常

SecondaryTable JoinColumn无法引用非主键.

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

Eel*_*lke 11

根据JPA 2.0规范第11.1.21节"JoinColumn注释"(第379页)

支持不是引用表的主键列的引用列是可选的.使用此类映射的应用程序将无法移植.

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

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