我有一个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的实现。
我应该使用什么来引用外键列?
我有一个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;
@ManyToOne
,并在另一个类上使用了“mappedBy”,这意味着该列(名为“LicenseeFK”)是一个外键,因此是一个联接列。因此,它是一个名为“LicenseeFK”的联接列。希望现在清楚了。 - Aleksandar@Column
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
,这是一种糟糕的策略。
同时使用@JoinColumn
和@Column
会导致相同的错误。
将其改为只使用:@JoinColumn
即可解决。
在我的情况下,@VaishaliKulkarni的答案有助于确定问题。
我忘记为@Column注释编写字段,它影响了下一个字段。
@Column(name = "account_id")
// I forgot to write field here
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
我在“customer”字段处遇到了异常。