ChatGPT解决这个技术问题 Extra ChatGPT

@ManyToOne 属性上不允许使用 @Column(s)

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

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

也许删除 @ManyToOne 注释可以解决您的问题。

k
kraftan

使用 @JoinColumn 而不是 @Column

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

但为什么?对此有何解释?
@OndrejTokar 可能是因为您在此使用 @ManyToOne,而在另一侧(类)使用 "mappedBy",这意味着该列(名为 "LicenseeFK")是一个外键,因此是一个连接列。因此,它是一个名为 "LicenseeFK" 的joinedColumn。我希望现在很清楚。
在 2021 年发现这个:P。谢谢
@OndrejTokar 去文档怎么样?你有注释名称......
E
EM-Creations

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


你的回答很混乱。您不能将 \@Column 与 \@ManyToOne 点一起使用。
V
Vlad Mihalcea

@柱子

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

因此,如果实体属性名称与基础列名称不同,则需要使用 @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,这是一个糟糕的策略。


S
Saibaba Gunturi

就我而言,@VaishaliKulkarni 的回答有助于识别问题。

我错过了为@Column 注释写字段,它影响了下一个字段。

@Column(name = "account_id")
// I forgot to write field here

@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;

所以,我在“客户”领域遇到了异常。