@Column (s) không được phép trên tài sản @ManyToOne


136

Tôi có một thực thể JPA với một thuộc tính được đặt là

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

Nhưng khi tôi triển khai trên JBoss 6, ứng dụng sẽ báo lỗi:

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

Tôi sử dụng Hibernate 3.5 khi triển khai JPA 2.0.

Tôi nên sử dụng gì để tham chiếu cột khóa ngoại?


Có thể xóa chú thích @ManyToOne giải quyết vấn đề của bạn.
ℛɑƒæĿᴿᴹᴿ

Câu trả lời:


287

Sử dụng @JoinColumnthay vì @Column:

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

13
Nhưng tại sao? Có lời giải thích nào cho điều đó?
Ondrej Tokar

4
@OndrejTokar có thể vì Bạn sử dụng @ManyToOnetrên này và "mappedBy"ở phía bên kia (lớp), có nghĩa là cột này (được đặt tên "LicenseeFK") là một khóa ngoại, và do đó là một cột đã tham gia. Vì vậy, nó là một tham gia có tên "LicenseeFK". Tôi hy vọng nó là rõ ràng bây giờ.
Alexanderar

7

Sử dụng @JoinColumn@Columncùng nhau sẽ dẫn đến cùng một lỗi. Thay đổi nó để chỉ sử dụng: @JoinColumnđể sửa chữa nó.


9
Câu trả lời của bạn khá khó hiểu. Bạn không thể sử dụng \ @Column với điểm \ @ManyToOne.
Abbadon

1

@Column

JPA @Columnchú thích là cho các thuộc tính thực thể cơ bản, như String, Integer, Date.

Vì vậy, nếu tên thuộc tính thực thể khác với tên cột bên dưới, thì bạn cần sử dụng @Columnchú thích để chỉ định rõ ràng tên cột, như sau:

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

@JoinColumn

Các @JoinColumnchú thích được sử dụng để tùy chỉnh một tên cột Ngoại chính , và nó chỉ có thể được sử dụng với một hiệp hội thực thể.

Vì vậy, trong trường hợp của bạn, vì bạn đang sử dụng một @ManyToOnehiệp hội, bạn cần sử dụng @JoinColumn:

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

Lưu ý rằng chúng tôi đặt fetchthuộc tính là FetchType.LAZYvì theo mặc định, FetchType.EAGERđược sử dụng và đó là một chiến lược khủng khiếp. Để biết thêm chi tiết về lý do tại sao FetchType.LAZYmột mặc định tốt hơn nhiều, hãy xem bài viết này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.