我有一个 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 实现。
我应该使用什么来引用外键列?
使用 @JoinColumn
而不是 @Column
:
@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
一起使用 @JoinColumn
和 @Column
将导致相同的错误。将其更改为仅使用:@JoinColumn
来修复它。
@柱子
JPA @Column
注释用于基本实体属性,例如 String
、Integer
、Date
。
因此,如果实体属性名称与基础列名称不同,则需要使用 @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;
所以,我在“客户”领域遇到了异常。
@ManyToOne
,而在另一侧(类)使用"mappedBy"
,这意味着该列(名为"LicenseeFK"
)是一个外键,因此是一个连接列。因此,它是一个名为"LicenseeFK"
的joinedColumn。我希望现在很清楚。