@ManyToOne属性不允许@Column

时间:2010-11-08 05:22:59

标签: java hibernate jpa jboss annotations

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

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

5 个答案:

答案 0 :(得分:253)

使用@JoinColumn代替@Column

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

@Column

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

因此,如果实体属性名称与基础列名称不同,则需要使用@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()
                                        });

因此,我在“客户”字段中遇到异常。