@Column (s) non autorisé sur une propriété @ManyToOne

136

J'ai une entité JPA avec une propriété définie comme

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

Mais lorsque je déploie sur JBoss 6, l'application renvoie une erreur disant:

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

J'utilise Hibernate 3.5 comme implémentation JPA 2.0.

Que dois-je utiliser pour référencer la colonne de clé étrangère?

nouveau gars
la source
Peut-être que la suppression de l'annotation @ManyToOne résout votre problème.
ℛɑƒæĿᴿᴹᴿ

Réponses:

287

Utilisez à la @JoinColumnplace de @Column:

@ManyToOne
@JoinColumn(name="LicenseeFK")
private Licensee licensee;
kraftan
la source
13
Mais pourquoi? Une explication à cela?
Ondrej Tokar
4
@OndrejTokar peut-être parce que vous utilisez @ManyToOnesur ceci, et "mappedBy"de l'autre côté (classe), ce qui signifie que cette colonne (nommée "LicenseeFK") est une clé étrangère, et donc une colonne jointe. Donc, c'est une colonne jointe avec un nom "LicenseeFK". J'espère que c'est clair maintenant.
Aleksandar
7

Utiliser @JoinColumnet @Columnensemble entraînera la même erreur. Modifiez-le pour utiliser uniquement: @JoinColumnpour le réparer.

Vaishali Kulkarni
la source
9
Votre réponse est assez déroutante. Vous ne pouvez pas utiliser \ @Column avec un point \ @ManyToOne.
Abbadon
1

@Column

L'Assemblée parlementaire paritaire @Columnannotation est pour les attributs d'entités de base, comme String, Integer, Date.

Ainsi, si le nom de l'attribut d'entité diffère du nom de la colonne sous-jacente, vous devez utiliser l' @Columnannotation pour spécifier le nom de la colonne explicitement, comme ceci:

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

@JoinColumn

L' @JoinColumnannotation est utilisée pour personnaliser un nom de colonne de clé étrangère et ne peut être utilisée qu'avec une association d'entité.

Donc, dans votre cas, parce que vous utilisez une @ManyToOneassociation, vous devez utiliser @JoinColumn:

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

Notez que nous définissons l' fetchattribut sur FetchType.LAZYparce que, par défaut, FetchType.EAGERest utilisé, et c'est une stratégie terrible. Pour plus de détails sur les raisons pour lesquelles FetchType.LAZYune valeur par défaut est bien meilleure, consultez cet article .

Vlad Mihalcea
la source