当前位置: 首页 > 知识库问答 >
问题:

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

端木野
2023-03-14

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

供应商(vendorid-pk,vendorEid,name)
VendorContactBridge(bridgeid-pk,vendorEid,contactEid)
联系人(contactid-pk,contactEid,phone)

vendorEid和contactEid不是表的主键,但用作联接表VendoContactBridge中的联接列。

供应商实体-

@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,我没有得到任何异常,但它没有加载集合。联想有什么不好?

共有1个答案

羊舌兴文
2023-03-14

根据JPA 2.0规范第11.1.21段,第379页上的JoinColumn annotaion

对不是被引用表的主键列的被引用列的支持是可选的。使用此类映射的应用程序将不具有可移植性。

似乎Hibernate选择不实现这个可选部分。其他实现可能会。我在EclipseLink上尝试了它,但它也不起作用(它无法验证)。

我看到两个工作在附近。一种是调整您的模式以使用主键,从数据库设计理论的角度来看,这是正确的做法。但是,这可能不是一个选项,因为其他软件依赖于这个模式,这就剩下选项二了。通过不修改JPA中的关系来解决这个问题,只需使用eID并自己检索相关对象。

 类似资料:
  • 问题内容: 问题 首先,我想知道我的数据库结构很糟糕,但是目前我无法更改它。 话虽这么说,我需要在Hibernate(4.2.1)中创建一对多的双向关系,该关系不涉及主键(关系的“父”侧仅包含唯一键)并且不涉及联接表。表示这种关系的外键是从“子”到“父”的反向指针(请参见下文)。我已经搜索并尝试了各种不同的注释配置,但是没有运气。我要的是可能的吗? 数据库 GLOBAL_PART PART_REL

  • 我试图为quiz数据库创建JPA实体类,其中有两个实体问题和选项。 方法1 创建从问题到选项的OneToMany关系,如下所示 方法2 问题实体 选项实体 完整问题实体 Option Entity@Entity@Table(Name=“Options”)公共类选项实现Serializable{private static final long serialVersionUID=1L; } 服务类别

  • 问题内容: 是否可以在不使用JPA在数据库中创建外键的情况下建立ManyToOne关联? 这些表由另一个系统拥有,并异步填充。因此,数据库中不能有FK。几乎总是,最终还是有联系。 问题是,即使ConstraintMode.NO_CONSTRAINT,JPA SchemaUpdate也会尝试添加FK。 [错误] ohthSchemaUpdate-无法添加外键约束 如果它没有使其余语句失败,我们可以忽

  • 问题内容: 我想在以下(简化的)数据库中应用JPA: 因此,一个节点可以具有多个权限,并且一个权限可以被多个节点引用。 我希望我的班级看起来像这样: 但是注释“ @ManyToMany”似乎仅可用于“ @JoinTable”,在这种情况下,它不可用(据我所知)。有人知道修改数据库之外是否还有其他方法吗? 问题答案: JPA不允许这样做,因为它需要外键来引用完整的主键以用于标识目的,并且它可能不适用

  • 比如我们有一个用户表,每个用户都可以发布文章,用户和文章就是一对多的关系。 当然imi-demo里一对多的例子选的不好,不过不重要,理解意思就行。 定义 一对多关联会用到的注解: @OneToMany、@JoinFrom、@JoinTo、@AutoSelect、@AutoInsert、@AutoUpdate、@AutoSave、@AutoDelete 如 imi-demo 中代码所示,UserWi

  • 一对多关联 关联定义 一对多关联的情况也比较常见,使用hasMany方法定义,参数包括: hasMany('关联模型','外键','主键'); 除了关联模型外,其它参数都是可选。 关联模型(必须):模型名或者模型类名 外键:关联模型外键,默认的外键名规则是当前模型名+_id 主键:当前模型主键,一般会自动获取也可以指定传入 例如一篇文章可以有多个评论 <?php namespace app\ind