@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?

cara novo
fonte
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;
kraftan
fonte
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.

Vaishali Kulkarni
fonte
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 .

Vlad Mihalcea
fonte