【问题标题】:@JoinColumns - repeated column in mapping for entity@JoinColumns - 实体映射中的重复列
【发布时间】:2012-09-07 01:15:30
【问题描述】:

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

我遇到了错误:

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 表连接起来。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    使用 JoinColumn 注释时,您必须注意,根据两个表/实体之间的关联类型,属性“name”和“referencedColumnName”正在改变它们引用的位置。 查看 JPA API,或look here 了解更详细的说明。

    在您的情况下,“divisonLabel”属性上的 JoinColumn 的“名称”属性引用了源表/实体。并且“referencedColumnName”引用了 LabelFile 表/实体中的列。 因此,您试图在源表/实体中有两个“除”列。

    让映射工作切换“name”和“referencedColumnName”的值。

    【讨论】:

    • 切换它们不会改变我从哪个表中抓取?我想有一个“division”列并在我的加入中使用“division”并使用它来匹配也在 LabelFile 中的“abbr”。
    • 它会的,这就是重点。您现在编写 JPA/Hibernate 的方式是尝试创建两个名为“division”的列;一个用于与任何关联无关的纯文本字段;第二个用作复合键的一部分。 LabelFile 属性上方的注释是在当前实体/表中创建新的字段/列。注意:尽量不要以列和表的形式思考,JPA 和 ORM 是为了向您隐藏数据库并让您使用对象。免责声明:我在没有编写任何代码的情况下输入此内容,因此可能是我忽略了某些内容。希望不会。
    【解决方案2】:

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

    question 中提供了有关何时使用这些属性的更多信息。

    【讨论】:

    • 但是如果我想让列都可以插入和更新呢?
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多