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

我有一个 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的实现。

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

95685 次浏览

使用 @JoinColumn代替 @Column:

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

同时使用 @JoinColumn@Column将导致相同的错误。 更改为只使用: @JoinColumn来修复它。

@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,这是一个糟糕的策略。

在我的案例中,@VaishaliKulkarni 的回答有助于找出问题所在。

我错过了为@Column 注释写字段,它影响了下一个字段。

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


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

所以,我在“客户”领域得到了例外。