【问题标题】:@Column(s) not allowed on a @ManyToOne property@ManyToOne 属性上不允许使用 @Column(s)
【发布时间】:2011-05-06 12:13:01
【问题描述】:

我有一个 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 注释可以解决您的问题。

标签: java hibernate jpa jboss annotations


【解决方案1】:

@Column

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,这是一个糟糕的策略。

【讨论】:

    【解决方案2】:

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

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

    @Column(name = "account_id")
    // I forgot to write field here
    
    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;
    

    所以,我在“客户”字段中遇到了异常。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你的回答很混乱。您不能将 \@Column 与 \@ManyToOne 点一起使用。
      【解决方案4】:

      使用@JoinColumn 代替@Column

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

      【讨论】:

      • 但是为什么呢?对此有何解释?
      • @OndrejTokar 可能是因为您在此使用@ManyToOne,在另一侧(类)使用"mappedBy",这意味着此列(名为"LicenseeFK")是外键,因此一个连接的列。所以,它是一个名为"LicenseeFK" 的joinedColumn。我希望现在很清楚。
      • 在 2021 年发现这个:P。谢谢
      • @OndrejTokar 去文档呢?您有注释名称...
      猜你喜欢
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2011-03-30
      • 2020-10-01
      相关资源
      最近更新 更多