@JoinColumns - 实体映射中的重复列

3

我可能误解了@JoinColumns的工作原理,但当我重复使用名称属性时,我遇到了错误。但是名称属性不是映射到数据库列吗?我不能重用它吗?

我遇到的错误:

Repeated column in mapping for entity: data.model.DP column: division

代码:

@Column(name = "division", nullable = false)
private String division;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
    @JoinColumn(name = "division_labeldefintion", referencedColumnName = "labeldefinition"),
    @JoinColumn(name = "division", referencedColumnName = "abbr")
})
private LabelFile divisionLabel;

我需要做的是从一个包含“division”列的表格中进行多列连接,并将其与“LabelFile”表格进行连接。
2个回答

14

如果您想在映射中重复使用一个列,您应该将其中一个标记为insertable=false updatable=false,以便Hibernate知道哪个Java引用值是相关的。

关于何时使用这些属性的更多信息可以在此问题中找到。


但是如果我想让这两列既可插入又可更新怎么办? - Pratik Ambani

1
使用JoinColumn注释时,您必须注意,根据两个表/实体之间的关联类型,“name”和“referencedColumnName”属性会更改它们引用的位置。 请查看JPA API或在此处查看以获取更详细的描述。
在您的情况下,“divisonLabel”属性上的JoinColumn的“name”属性引用源表/实体。而“referencedColumnName”引用LabelFile表/实体中的列。 因此,您正在尝试在源表/实体中拥有两个“division”列。
为使映射正常工作,请交换“name”和“referencedColumnName”的值。

切换它们不会改变我正在获取的表格吗? 我想要一个“division”列,并在我的连接中使用“division”,并将其与LabelFile中也有的“abbr”匹配。 - Hanna
会的,这就是重点。你现在编写的方式是JPA/Hibernate试图创建两个名为“division”的列;一个用于纯文本字段,与任何关联无关;第二个将用作复合键的一部分。 在LabelFile属性上方的注释正在在当前实体/表中创建新的字段/列。注意:尽量不要以列和表的形式思考,JPA和ORM存在的目的是隐藏数据库,并使您使用对象进行工作。免责声明:我没有编写任何代码就打字,所以可能会忽略某些东西。希望不是这样。 - deyo.vuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接