@ Колонна (ы) не разрешены для свойства @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;
kraftan
источник
13
Но почему? Любое объяснение этому?
Ондрей Токарь
4
@OndrejTokar может быть потому, что Вы используете @ManyToOneдля этого и "mappedBy"для другой стороны (класса), что означает, что этот столбец (именованный "LicenseeFK") является внешним ключом и, следовательно, объединенным столбцом. Итак, это joinColumn с именем "LicenseeFK". Надеюсь теперь понятно.
Александр
7

Использование @JoinColumnи @Columnвместе приведет к той же ошибке. Измените это, чтобы использовать только: @JoinColumnчтобы исправить это.

Вайшали Кулкарни
источник
9
Ваш ответ довольно запутанный. Вы не можете использовать \ @Column с точкой \ @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по умолчанию лучше, ознакомьтесь с этой статьей .

Влад Михалча
источник