Problemas com o JPA - Many to One

Galera, eu tô com um problema no JPA. Faço o netbeans gerar as classes de entidades do banco de dados porém acontece um erro aki:

@ManyToOne
     @JoinColumn(name="codigoTipoMaterial", referencedColumnName = "codigo")
     private TipoMaterial tipoMaterial;

dizendo que eu tenho que usar o referencedColumnName em cada campo e referenciar cada tabela tipo isso.

Alguem já passou por isso?
queria usar o código gerado automaticamente pelo JPA, mas dá erro!!

Posta o código do erro.

O erro a que ele se refere é um comportamento normal do mapeamento JPA.
Ele está com dificuldades para entender a razão pela qual os relacionamentos @ManyToOne estão gerando o @JoinColumn e setando o referencedColumnName.

1 curtida

Olá,
o erro é esse:

Exception in thread “main” Local Exception Stack:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@1d16e93
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [com.sigef_jar_1.0-SNAPSHOTPU] failed.
Internal Exception: Exception [EclipseLink-7220] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The @JoinColumns on the annotated element [field estado] from the entity class [class com.sigef.model.pojo.Cidade] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:127)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:177)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at com.sigef.model.DAO.Model.main(Model.java:38)

O JPA me mostra o erro e me dá a seguinte solução, mas esse erro não vem de classes que eu mesmo fiz, mas sim de classes geradas pelo próprio JPA a partir dum banco de dados:

Exception Description: The @JoinColumns on the annotated element [field estado] from the entity class [class com.sigef.model.pojo.Cidade] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
at

Olá @AndreSI, pelo o que eu já trabalhei com JPA, este erro geralmente acontecia comigo quando a modelagem do DB está feita de forma incorreta, e isso é o que atrapalha o java de realizar o mapeamento correto de acordo com as tabelas existentes no DB, pois ele implementa de acordo com o que foi criado lá, ou seja, se a modelagem estiver errada, ele vai mapear errado.
Aconselho você reavaliar o seu DB e ver se a modelagem está 100% correta.
Espero ter ajudado, abraço!

Realmente deve ser isso, Obrigado!
Usei o mysql workbench pra modelar e as vezes quando agente deleta e insere uma tabela no modelo ele não consegue atualizar em outras tabelas relacionadas, por isso as vezes até é necessário verificar o script gerado.
Vou verificar, valew!!

Descobri o erro!
é o seguinte:
tenho as tabelas em um BD:
pais -----< cidade -------< endereco -----< pessoa
todas ligadas atraves de relacao 1:n
a tabela “pessoa” deveria ter como chave estrangeira as seguintes:
FK’s

  1. endereco_id
  2. endereco_cidade_id
  3. endereco_cidade_estado_id
  4. endereco_cidade_estado_pais_id

mas eu costumava deixar apenas a chave da tabela mais próxima (endereco_id) e deletava as outras (2, 3 e 4) por não achá-las necessárias.

mas o JPA precisa delas. Quando deixei todas as chaves NÃO DEU MAIS ERRO e o JPA criou os @joinColumns({ }) com todos os @joinColumn() que a mesg de erro pedia.

agora não sabia que era necessário manter todas essas FK’s vindas lá da tabela do inicio das relações.

1 curtida