@Column (s) für eine @ ManyToOne-Eigenschaft nicht zulässig


136

Ich habe eine JPA-Entität mit einer Eigenschaft, die als festgelegt ist

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

Bei der Bereitstellung auf JBoss 6 gibt die Anwendung jedoch einen Fehler aus:

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

Ich verwende Hibernate 3.5 als JPA 2.0-Implementierung.

Was soll ich verwenden, um auf die Fremdschlüsselspalte zu verweisen?


Möglicherweise wird Ihr Problem durch Entfernen der Annotation @ManyToOne behoben.
11ɑƒæĿᴿᴹᴿ

Antworten:


286

Verwenden Sie @JoinColumnanstelle von @Column:

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

13
Aber wieso? Irgendeine Erklärung dafür?
Ondrej Tokar

4
@OndrejTokar vielleicht, weil Sie @ManyToOneauf dieser und "mappedBy"auf der anderen Seite (Klasse) verwenden, was bedeutet, dass diese Spalte (benannt "LicenseeFK") ein Fremdschlüssel und daher eine verknüpfte Spalte ist. Es ist also eine joinColumn mit Namen "LicenseeFK". Ich hoffe es ist jetzt klar.
Aleksandar

7

Die Verwendung von @JoinColumnund @Columnzusammen führt zu demselben Fehler. Ändern Sie es so, dass es nur verwendet wird: @JoinColumnum es zu beheben.


9
Ihre Antwort ist ziemlich verwirrend. Sie können \ @Column nicht mit \ @ManyToOne-Punkt verwenden.
Abbadon

1

@Column

Die PPV - @ColumnAnnotation ist für die grundlegende Einheit Attribute, wie String, Integer, Date.

Wenn sich der Name des Entitätsattributs vom Namen der zugrunde liegenden Spalte unterscheidet, müssen Sie die @ColumnAnmerkung verwenden, um den Spaltennamen explizit wie folgt anzugeben:

@Column(name="created_on")
private LocalDate createdOn;

@JoinColumn

Die @JoinColumnAnmerkung wird verwendet , um ein anpassen Fremdschlüsselspaltennamen , und es kann nur mit einer Einheit , verwendet werden.

In Ihrem Fall müssen Sie also Folgendes verwenden, da Sie eine @ManyToOneZuordnung verwenden @JoinColumn:

@ManyToOne(fetch=FetchTYpe.LAZY)
@JoinColumn(name="LicenseeFK")
private Licensee licensee;

Beachten Sie, dass wir das fetchAttribut auf setzen, FetchType.LAZYweil standardmäßig FetchType.EAGERverwendet wird, und das ist eine schreckliche Strategie. Weitere Informationen dazu, warum dies FetchType.LAZYeine viel bessere Standardeinstellung ist, finden Sie in diesem Artikel .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.