【问题标题】:One to many association - Join tables with non primary key column in JPA一对多关联 - 在 JPA 中连接具有非主键列的表
【发布时间】:2012-12-02 21:09:39
【问题描述】:

我正在处理旧系统,需要从数据库中读取一些信息。下面是表关系

供应商(vendorId - 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 不能引用非主键。

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

【问题讨论】:

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


    【解决方案1】:

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

    支持不是主键列的引用列 参考表是可选的。使用此类映射的应用程序将 不便携。

    Hibernate 似乎选择不实现这个可选部分。其他实现可能。我在 EclipseLink 上试过,但那个也不起作用(验证失败)。

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

    【讨论】:

    • 选项 2:你的意思是,我应该让两个 db 调用一个,以便根据 VendorEid 从 VendorContactBridge 获取 ContactEid 并在 ContactEid 上的 Contact 上再次调用?我的理解正确吗?
    • 这将是基本原则。但最好使用本机查询,因为您可以进行连接,从而使用单个 sql 查询来检索对象。
    【解决方案2】:

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

    看这里:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多