@Column (s) non consentiti su una proprietà @ManyToOne


136

Ho un'entità JPA con una proprietà impostata come

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

Ma quando eseguo la distribuzione su JBoss 6 l'applicazione genera un errore che dice:

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

Uso Hibernate 3.5 come implementazione di JPA 2.0.

Cosa devo usare per fare riferimento alla colonna chiave esterna?


Forse la rimozione dell'annotazione @ManyToOne risolve il problema.
ĿᴿᴹᴿæĿᴿᴹᴿ

Risposte:


287

Usa @JoinColumninvece di @Column:

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

13
Ma perché? Qualche spiegazione a questo?
Ondrej Tokar,

4
@OndrejTokar forse perché lo usi @ManyToOnesu questo, e "mappedBy"sull'altro lato (classe), il che significa che questa colonna (denominata "LicenseeFK") è una chiave esterna, e quindi una colonna unita. Quindi, è un joinColumn con nome "LicenseeFK". Spero sia chiaro adesso.
Aleksandar,

7

L'uso @JoinColumne @Columninsieme comporteranno lo stesso errore. Modificalo per usare solo: @JoinColumnper ripararlo.


9
La tua risposta è abbastanza confusa. Non è possibile utilizzare \ @Column con il punto \ @ManyToOne.
Abbadon,

1

@Column

L'APP @Columnannotazione è per gli attributi di base di entità, come String, Integer, Date.

Pertanto, se il nome dell'attributo entità differisce dal nome della colonna sottostante, è necessario utilizzare l' @Columnannotazione per specificare esplicitamente il nome della colonna, in questo modo:

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

@JoinColumn

L' @JoinColumnannotazione viene utilizzata per personalizzare il nome di una colonna Chiave esterna e può essere utilizzata solo con un'associazione di entità.

Quindi, nel tuo caso, poiché stai utilizzando @ManyToOneun'associazione, devi utilizzare @JoinColumn:

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

Si noti che impostiamo l' fetchattributo su FetchType.LAZYperché, per impostazione predefinita, FetchType.EAGERviene utilizzato e questa è una strategia terribile. Per maggiori dettagli sul perché FetchType.LAZYè un valore predefinito molto migliore, consulta questo articolo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.