@Column (и) заборонено у властивості @ManyToOne


136

У мене є об'єкт 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.

Що потрібно використовувати для посилання на стовпець із зовнішнім ключем?


Можливо, видалення анотації @ManyToOne вирішить вашу проблему.
ℛɑƒæĿᴿᴹᴿ

Відповіді:


287

Використовуйте @JoinColumnзамість @Column:

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

13
Але чому? Будь-яке пояснення цьому?
Ондрей Токар

4
@OndrejTokar, можливо, тому, що ви використовуєте і @ManyToOneна цьому, і "mappedBy"на іншому боці (класі), це означає, що цей стовпець (названий "LicenseeFK") є іноземним ключем, а отже, і об'єднаним стовпцем. Отже, це об'єднана колона з назвою "LicenseeFK". Я сподіваюся, що це зрозуміло зараз
Олександр

7

Використання @JoinColumnта @Columnразом призведе до однієї помилки. Змініть його лише на використання: @JoinColumnщоб виправити.


9
Ваша відповідь досить заплутана. Ви не можете використовувати \ @Колонку з точкою \ @ManyToOne.
Аббадон

1

@Column

JPA @Columnанотації для основних атрибутів сутностей, як String, Integer, Date.

Отже, якщо ім'я атрибута сутності відрізняється від основного імені стовпця, тоді вам потрібно використовувати @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значно краще за замовчуванням, ознайомтеся з цією статтею .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.