@Column (s) tidak diperbolehkan pada properti @ManyToOne

139

Saya memiliki entitas JPA dengan properti yang ditetapkan sebagai

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

Tetapi ketika saya menerapkan pada JBoss 6, aplikasi menampilkan kesalahan yang mengatakan:

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

Saya menggunakan Hibernate 3.5 sebagai implementasi JPA 2.0.

Apa yang harus saya gunakan untuk mereferensikan kolom kunci asing?

orang baru
sumber
Mungkin menghapus anotasi @ManyToOne dapat menyelesaikan masalah Anda.
ℛɑƒæĿᴿᴹᴿ

Jawaban:

292

Gunakan @JoinColumnalih-alih @Column:

@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
kraftan
sumber
14
Tapi kenapa? Ada penjelasan untuk itu?
Ondrej Tokar
4
@OndrejTokar mungkin karena Anda menggunakan @ManyToOneini, dan "mappedBy"di sisi lain (kelas), yang berarti bahwa kolom ini (bernama "LicenseeFK") adalah kunci asing, dan oleh karena itu kolom yang digabungkan. Jadi, ini adalah joinColumn dengan nama "LicenseeFK". Saya harap sudah jelas sekarang.
Aleksandar
7

Menggunakan @JoinColumndan @Columnbersama - sama akan menghasilkan kesalahan yang sama. Ubah menjadi hanya menggunakan: @JoinColumnuntuk memperbaikinya.

Vaishali Kulkarni
sumber
9
Jawaban Anda cukup membingungkan. Anda tidak dapat menggunakan \ @Column dengan \ @ManyToOne titik.
Abbadon
1

@Column

JPA @Columnpenjelasan adalah untuk atribut entitas dasar, seperti String, Integer, Date.

Jadi, jika nama atribut entitas berbeda dari nama kolom yang mendasarinya, Anda perlu menggunakan @Columnanotasi untuk menentukan nama kolom secara eksplisit, seperti ini:

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

@JoinColumn

The @JoinColumnpenjelasan digunakan untuk menyesuaikan Key Foreign nama kolom , dan hanya dapat digunakan dengan asosiasi entitas.

Jadi, dalam kasus Anda, karena Anda menggunakan @ManyToOnepengaitan, Anda perlu menggunakan @JoinColumn:

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

Perhatikan bahwa kita menyetel fetchatribut ke FetchType.LAZYkarena, secara default, FetchType.EAGERdigunakan, dan itu adalah strategi yang buruk. Untuk detail lebih lanjut tentang mengapa FetchType.LAZYdefault yang jauh lebih baik, lihat artikel ini .

Vlad Mihalcea
sumber
1

Dalam kasus saya, jawaban @ VaishaliKulkarni sangat membantu untuk mengidentifikasi masalah.

Saya melewatkan untuk menulis bidang untuk anosi @Column dan itu berlaku di bidang berikutnya.

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

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

Jadi, saya mendapatkan pengecualian di bidang "pelanggan".

saibaba.gunturi
sumber