我正在研究遗留系统,需要从数据库中读取一些信息。以下是表格关系
供应商(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,我没有得到任何异常,但它没有加载该集合。关联有什么问题?
答案 0 :(得分:10)
根据第379页的JPA 2.0 specs段11.1.21 JoinColumn注释
支持不是主键列的引用列 引用表是可选的。使用这种映射的应用程序将会 不可携带。
看来Hibernate选择不实现这个可选部分。其他实现可能。我在EclipseLink上尝试了它,但是它也不起作用(它验证失败)。
我看到两个工作。一种是调整模式以使用主键,从数据库设计理论的角度来看,这是正确的。然而,这可能不是一个选项,因为其他软件取决于这个模式留下选项二。通过NOT修改JPA中的关系来解决它只需使用eid并自己检索相关对象。
答案 1 :(得分:1)