@ManyToOne属性上不允许使用@Column


136

我有一个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注释可以解决您的问题。
ℛɑƒæĿᴿᴹᴿ

Answers:


287

使用@JoinColumn代替@Column

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

13
但为什么?有什么解释吗?
Ondrej Tokar

4
@OndrejTokar可能是因为您@ManyToOne在此以及"mappedBy"另一侧(类)上使用,这意味着此列(名为"LicenseeFK")是外键,因此是联接列。因此,它是一个具有name的joinColumn "LicenseeFK"。我希望现在已经清楚了。
Aleksandar


1

@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使用该属性,这是一个糟糕的策略。有关为什么FetchType.LAZY默认更好的详细信息,请参阅本文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.