@Column (s) não permitidos em uma propriedade @ManyToOne


136

Eu tenho uma entidade JPA com uma propriedade definida como

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

Mas quando eu implanto no JBoss 6, o aplicativo gera um erro dizendo:

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

Eu uso o Hibernate 3.5 como a implementação do JPA 2.0.

O que devo usar para fazer referência à coluna de chave estrangeira?


Talvez a remoção da anotação @ManyToOne resolva seu problema.
ℛɑƒæĿᴿᴹᴿ

Respostas:


287

Use em @JoinColumnvez de @Column:

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

13
Mas por que? Alguma explicação para isso?
Ondrej Tokar

4
@OndrejTokar talvez porque Você use @ManyToOneisso e "mappedBy"do outro lado (classe), o que significa que essa coluna (nomeada "LicenseeFK") é uma chave estrangeira e, portanto, uma coluna unida. Portanto, é um joinColumn com nome "LicenseeFK". Espero que esteja claro agora.
Aleksandar

7

Usar @JoinColumne @Columnjuntos resultará no mesmo erro. Altere para usar apenas: @JoinColumnpara corrigi-lo.


9
Sua resposta é bastante confusa. Você não pode usar \ @Column com o ponto \ @ManyToOne.
Abbadon

1

@Column

O JPA @Columnanotação é para atributos básicos entidade, como String, Integer, Date.

Portanto, se o nome do atributo da entidade for diferente do nome da coluna subjacente, será necessário usar a @Columnanotação para especificar explicitamente o nome da coluna, assim:

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

@JoinColumn

A @JoinColumnanotação é usada para personalizar o nome da coluna Chave Externa e só pode ser usada com uma associação de entidade.

Portanto, no seu caso, porque você está usando uma @ManyToOneassociação, você precisa usar @JoinColumn:

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

Observe que definimos o fetchatributo como FetchType.LAZYporque, por padrão, FetchType.EAGERé usado, e essa é uma estratégia terrível. Para mais detalhes sobre por que o FetchType.LAZYpadrão é muito melhor, confira este artigo .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.