@ManyToOne属性不允许@Column

new*_*guy 131 java jboss annotations hibernate jpa

我有一个JPA实体,其属性设置为

@ManyToOne
@Column(name="LicenseeFK")
private Licensee licensee;
Run Code Online (Sandbox Code Playgroud)

但是当我在JBoss 6上部署时,应用程序会抛出一个错误:

org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property
Run Code Online (Sandbox Code Playgroud)

我使用Hibernate 3.5作为JPA 2.0实现.

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

kra*_*tan 274

使用@JoinColumn而不是@Column:

@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
Run Code Online (Sandbox Code Playgroud)

  • 但为什么?对此有何解释? (13认同)
  • @OndrejTokar可能是因为你在这上面使用`@ ManyToOne`,另一边(class)使用``mappedBy``,这意味着这个列(名为`"LicenseeFK"`)是一个外键,因此是一个连接列.因此,它是一个名为"LicenseeFK"的joinColumn.我希望现在很清楚. (3认同)

Vla*_*cea 10

@Column

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

因此,如果实体属性名称与基础列名称不同,则需要使用注释@Column显式指定列名称,如下所示:

@Column(name="created_on")
private LocalDate createdOn;
Run Code Online (Sandbox Code Playgroud)

@JoinColumn

@JoinColumn注释用于自定义外键列名称,并且只能与实体关联一起使用。

因此,在您的情况下,因为您正在使用@ManyToOne关联,所以您需要使用@JoinColumn

@ManyToOne(fetch=FetchTYpe.LAZY)
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
Run Code Online (Sandbox Code Playgroud)

请注意,我们将fetch属性设置为FetchType.LAZY因为默认情况下FetchType.EAGER使用,这是一个糟糕的策略。


小智 5

使用@JoinColumn@Column一起将导致相同的错误.将其更改为仅用于:@JoinColumn修复它.

  • 你的答案很混乱.您不能将\ @Column与\ _ManyToOne点一起使用. (9认同)