@Columnは@ManyToOneプロパティでは許可されていません


136

プロパティが次のように設定されているJPAエンティティがあります

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

しかし、JBoss 6にデプロイすると、アプリケーションが次のエラーをスローします。

org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property

JPA 2.0実装としてHibernate 3.5を使用しています。

外部キー列を参照するには何を使用すればよいですか?


@ManyToOneアノテーションを削除すると、問題が解決する場合があります。
ℛɑƒæĿᴿᴹᴿ

回答:


287

@JoinColumn代わりに使用@Column

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

13
しかし、なぜ?説明はありますか?
Ondrej Tokar

4
@OndrejTokarは、おそらく@ManyToOneこれと"mappedBy"反対側(クラス)で使用しているためです。つまり、この列(という名前"LicenseeFK")は外部キーであり、したがって結合された列です。したがって、これはの名前を持つjoinedColumn "LicenseeFK"です。私はそれが今明らかであることを望みます。
Aleksandar

7

@JoinColumnおよびを@Column一緒に使用すると、同じエラーが発生します。使用するだけに変更します:@JoinColumn修正します。


9
あなたの答えはかなり混乱しています。\ @Columnを\ @ManyToOneポイントで使用することはできません。
アバドン2015年

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.LAZYFetchType.EAGERFetchType.LAZY

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.