2012-09-13 229 views
3

我可能只是误解了@JoinColumns的工作方式,但在重新使用name属性时出现错误。但是名称属性没有映射到数据库列?我不应该重复使用它吗?@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表一起加入

回答

1

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

在你的情况下,“divisonLabel”属性上JoinColumn的“name”属性引用源表/实体。而“referencedColumnName”引用来自LabelFile表/实体的列。 因此,您正试图在源表/实体中拥有两个“division”列。

要为“名称”和“referencedColumnName”映射工作开关值。

+0

不会切换它们会改变我从哪个表中抓取? 我想要一个“分区”列,并在我的连接中使用“分区”,并使用它来匹配LabelFile中的“abbr”。 – Johannes

+0

它会的,这就是要点。你现在编写它的方式JPA/Hibernate试图创建两个名为“division”的列;一个用于纯文本字段,与任何关联无关;第二个被用作组合键的一部分。 LabelFile属性上面的注释正在当前实体/表内创建新的字段/列。 注意:尽量不要以列和表格的形式思考,JPA和ORM在那里隐藏数据库,让你使用对象来代替。 免责声明:我在没有编写任何代码的情况下输入此代码,因此可能是我忽略了某些内容。希望不是。 –

9

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

有关何时使用这些属性的更多信息,请参见question

相关问题