@Column(s)不允许在@ManyToOne属性上使用

162

我有一个JPA实体,其中一个属性设置为

@ManyToOne
@Column(name="LicenseeFK")
private Licensee licensee;

但是当我在 JBoss 6 上部署时,应用程序会抛出一个错误:

org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property

我使用Hibernate 3.5作为JPA 2.0的实现。

我应该使用什么来引用外键列?


也许移除 @ManyToOne 注解可以解决你的问题。 - ℛɑƒæĿᴿᴹᴿ
4个回答

336

请使用@JoinColumn而不是@Column

@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;

15
为什么?有解释吗? - Ondrej Tokar
6
也许是因为您在这个类上使用了@ManyToOne,并在另一个类上使用了“mappedBy”,这意味着该列(名为“LicenseeFK”)是一个外键,因此是一个联接列。因此,它是一个名为“LicenseeFK”的联接列。希望现在清楚了。 - Aleksandar
发现这个在2021年 :P。谢谢。 - Hikaru Shindo
@OndrejTokar,去文档看看怎么样?你有注释的名称... - Luis Alfredo Serrano Díaz

10

@Column

JPA的@Column注释用于基本实体属性,如StringIntegerDate

因此,如果实体属性名称与底层列名称不同,则需要使用@Column注释来显式指定列名称,例如:

@Column(name="created_on")
private LocalDate createdOn;

@JoinColumn

@JoinColumn注解用于自定义外键列名称,只能与实体关联一起使用。

因此,在您的情况下,由于您正在使用@ManyToOne关联,所以需要使用@JoinColumn

@ManyToOne(fetch=FetchTYpe.LAZY)
@JoinColumn(name="LicenseeFK")
private Licensee licensee;

请注意,我们将fetch属性设置为FetchType.LAZY,因为默认情况下会使用FetchType.EAGER,这是一种糟糕的策略。


8

同时使用@JoinColumn@Column会导致相同的错误。 将其改为只使用:@JoinColumn即可解决。


11
你的回答相当令人困惑。你不能在 @ManyToOne 关联中使用 @Column。 - Abbadon

2

在我的情况下,@VaishaliKulkarni的答案有助于确定问题。

我忘记为@Column注释编写字段,它影响了下一个字段。

@Column(name = "account_id")
// I forgot to write field here

@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;

我在“customer”字段处遇到了异常。


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