@Column ไม่ได้รับอนุญาตในคุณสมบัติ @ManyToOne


139

ฉันมีเอนทิตี 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

ฉันควรใช้อะไรในการอ้างอิงคอลัมน์ Foreign Key


การลบคำอธิบายประกอบ @ManyToOne อาจช่วยแก้ปัญหาของคุณได้
ℛɑƒæĿᴿᴹᴿ

คำตอบ:


292

ใช้@JoinColumnแทน@Column:

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

14
แต่ทำไม? มีคำอธิบายอะไรไหม?
Ondrej Tokar

4
@OndrejTokar อาจเป็นเพราะคุณใช้@ManyToOneกับสิ่งนี้และ"mappedBy"ในอีกด้านหนึ่ง (คลาส) ซึ่งหมายความว่าคอลัมน์นี้ (ชื่อ"LicenseeFK") เป็นคีย์ต่างประเทศดังนั้นจึงเป็นคอลัมน์ที่เข้าร่วม ดังนั้นจึงเป็น joinedColumn "LicenseeFK"ที่มีชื่อ ฉันหวังว่าตอนนี้จะชัดเจน
Aleksandar

7

การใช้@JoinColumnและ@Columnร่วมกันจะทำให้เกิดข้อผิดพลาดเดียวกัน เปลี่ยนเป็นใช้เท่านั้น: @JoinColumnเพื่อแก้ไข


9
คำตอบของคุณค่อนข้างสับสน คุณไม่สามารถใช้ \ @Column กับ \ @ManyToOne point
Abbadon

1

@Column

JPA @Columnคำอธิบายประกอบสำหรับแอตทริบิวต์นิติบุคคลพื้นฐานเช่นString, ,IntegerDate

ดังนั้นหากชื่อแอตทริบิวต์ของเอนทิตีแตกต่างจากชื่อคอลัมน์ที่อยู่ข้างใต้คุณจะต้องใช้@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ถูกใช้และนั่นเป็นกลยุทธ์ที่แย่มาก สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่FetchType.LAZYเป็นค่าเริ่มต้นที่ดีมากตรวจสอบบทความนี้


1

ในกรณีของฉันคำตอบของ @ VaishaliKulkarni มีประโยชน์ในการระบุปัญหา

ฉันพลาดที่จะเขียนฟิลด์สำหรับคำอธิบายประกอบ @Column และมีผลในฟิลด์ถัดไป

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

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

ดังนั้นฉันจึงได้รับข้อยกเว้นที่ช่อง "ลูกค้า"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.