@Column (s) no permitidos en una propiedad @ManyToOne


136

Tengo una entidad JPA con una propiedad establecida como

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

Pero cuando despliegue en JBoss 6, la aplicación arroja un error que dice:

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

Yo uso Hibernate 3.5 como la implementación JPA 2.0.

¿Qué debo usar para hacer referencia a la columna de clave externa?


Quizás eliminar la anotación @ManyToOne resuelva su problema.
ℛɑƒæĿᴿᴹᴿ

Respuestas:


287

Usar en @JoinColumnlugar de @Column:

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

13
¿Pero por qué? ¿Alguna explicación para eso?
Ondrej Tokar

44
@OndrejTokar tal vez porque lo usa @ManyToOneen esto y "mappedBy"en el otro lado (clase), lo que significa que esta columna (nombrada "LicenseeFK") es una clave foránea y, por lo tanto, una columna unida. Entonces, es una Columna unida con nombre "LicenseeFK". Espero que esté claro ahora.
Aleksandar

7

Usar @JoinColumny @Columnjuntos dará como resultado el mismo error. Cámbielo para usar solo: @JoinColumnpara arreglarlo.


9
Tu respuesta es bastante confusa. No puede usar \ @Column con el punto \ @ManyToOne.
Abbadon

1

@Column

La APP @Columnanotación es para los atributos básicos de la entidad, como String, Integer, Date.

Entonces, si el nombre del atributo de la entidad difiere del nombre de la columna subyacente, entonces debe usar la @Columnanotación para especificar el nombre de la columna explícitamente, de esta manera:

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

@JoinColumn

La @JoinColumnanotación se usa para personalizar un nombre de columna de clave externa y solo se puede usar con una asociación de entidad.

Entonces, en su caso, debido a que está utilizando una @ManyToOneasociación, debe usar @JoinColumn:

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

Tenga en cuenta que establecemos el fetchatributo en FetchType.LAZYporque, de forma predeterminada, FetchType.EAGERse usa, y esa es una estrategia terrible. Para obtener más detalles sobre por qué FetchType.LAZYes un valor predeterminado mucho mejor, consulte este artículo .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.