我有一个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实现。
我应该使用什么来引用外键列?
答案 0 :(得分:253)
使用@JoinColumn
代替@Column
:
@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
答案 1 :(得分:4)
同时使用@JoinColumn
和@Column
会导致相同的错误。
将其更改为仅使用: @JoinColumn
来修复它。
答案 2 :(得分:3)
@Column
JPA @Column
注释用于基本实体属性,例如String
,Integer
,Date
。
因此,如果实体属性名称与基础列名称不同,则需要使用@Column
批注明确指定列名称,如下所示:
@Column(name="created_on")
private LocalDate createdOn;
@JoinColumn
@JoinColumn
注释用于自定义Foreign Key column name,并且只能与实体关联一起使用。
因此,在您的情况下,由于您使用的是@ManyToOne
关联,因此需要使用@JoinColumn
:
@ManyToOne(fetch=FetchTYpe.LAZY)
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
请注意,我们将
fetch
属性设置为FetchType.LAZY
,因为默认情况下使用FetchType.EAGER
,这是一个糟糕的策略。有关为什么FetchType.LAZY
是更好的默认设置的更多详细信息,请查看this article。
答案 3 :(得分:1)
@JoinColumn表示此字段是外键。 @Column表示此字段是表的普通列。
在SQL中,我们只能在 外键 上联接表。因此,@ ManyToOne或@ManyToMany仅适用于作为外键的字段。为了表明我们需要使用@JoinColumn。
当我们使用@Column时,hibernate会将其假定为表的普通列,并抛出错误说明
由于给定的列不是外键,因此您不能使用它来联接。
kraftan已经给出了解决方案
@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
答案 4 :(得分:1)
在我的案例中,@ VaishaliKulkarni的回答有助于发现问题。
我错过了为@Column注解编写字段,并且它影响了下一个字段。
var wrlist = db.Tbl_WorkRequest.ToList().Where(c => c.WR_Status == wrstatus &&
(wrtype.Length != 0) &&
c.WR_Family == wrfamily &&
wrfamily.Length!=0)
.Select(d => new {
WR_Title = d.WR_Title.ToString(),
WR_Type = d.WR_Type.ToString(),
WR_Family = d.WR_Family.ToString(),
WR_Status = d.WR_Status.ToString(),
WR_LocationAsset = d.WR_LocationAsset.ToString(),
WR_AssetName = d.WR_AssetName.ToString(),
WR_Requestor = d.WR_Requestor.ToString()
});
因此,我在“客户”字段中遇到异常。