@ Kolumny nie są dozwolone we właściwości @ManyToOne

136

Mam podmiot JPA z właściwością ustawioną jako

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

Ale kiedy wdrażam na JBoss 6, aplikacja wyświetla komunikat o błędzie:

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

Używam Hibernate 3.5 jako implementację JPA 2.0.

Czego należy użyć do odniesienia się do kolumny klucza obcego?

nowy chłopak
źródło
Może usunięcie adnotacji @ManyToOne rozwiąże Twój problem.
ℛɑƒæĿᴿᴹᴿ

Odpowiedzi:

287

Użyj @JoinColumnzamiast @Column:

@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
kraftan
źródło
13
Ale dlaczego? Jakieś wyjaśnienie?
Ondrej Tokar
4
@OndrejTokar może dlatego, że używasz @ManyToOnena tym i "mappedBy"po drugiej stronie (klasa), co oznacza, że ​​ta kolumna (nazwana "LicenseeFK") jest kluczem obcym, a więc połączoną kolumną. Jest to więc połączona kolumna o nazwie "LicenseeFK". Mam nadzieję, że teraz jest to jasne.
Aleksandar
7

Używanie @JoinColumni @Columnrazem spowoduje ten sam błąd. Zmień to na używanie: @JoinColumnaby to naprawić.

Vaishali Kulkarni
źródło
9
Twoja odpowiedź jest dość zagmatwana. Nie możesz użyć \ @Column z \ @ManyToOne punkt.
Abbadon
1

@Column

WZP @Columnadnotacja jest dla podstawowych atrybutów jednostki, jak String, Integer, Date.

Tak więc, jeśli nazwa atrybutu jednostki różni się od podstawowej nazwy kolumny, musisz użyć @Columnadnotacji, aby jawnie określić nazwę kolumny, na przykład:

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

@JoinColumn

@JoinColumnAdnotacji służy dostosować nazwę kolumny klucz obcy , a to może być używane tylko ze stowarzyszenia jednostki.

Tak więc w twoim przypadku, ponieważ używasz @ManyToOneskojarzenia, musisz użyć @JoinColumn:

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

Zauważ, że ustawiliśmy fetchatrybut na FetchType.LAZYponieważ domyślnie FetchType.EAGERjest używany, a to okropna strategia. Aby uzyskać więcej informacji o tym, dlaczego FetchType.LAZYjest to znacznie lepsze ustawienie domyślne, zapoznaj się z tym artykułem .

Vlad Mihalcea
źródło