Ola pessoal,
Esotu tendo dificuldades em montar um mapeamento entre varias tabelas relacionadas com uma outra com o JPA.
A minha situacao é a seguinte: possuo varias tabelas que posuem chave estrangeira para a tabela Pais.
Quando montei as classes de JPA, fiz os relacionamentos, mas logo quando vou rodar um teste aparece uma Exception:
[code]Exception in thread "main" javax.persistence.PersistenceException: Exception [TOPLINK-0] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.IntegrityException
Descriptor Exceptions:
Exception [TOPLINK-48] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [documen_candempr.cod_pais]. Only one may be defined as writable, all others must be specified read-only.
Mapping: oracle.toplink.essentials.mappings.OneToOneMapping[codPais]
Descriptor: RelationalDescriptor(br.com.mercur.th.model.DocumenCandempr --> [DatabaseTable(documen_candempr)])
Runtime Exceptions:
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:239)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)
at br.com.mercur.th.action.FormAcademicAction.main(FormAcademicAction.java:78)
Caused by: Exception [TOPLINK-0] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.IntegrityException
Descriptor Exceptions:
Exception [TOPLINK-48] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [documen_candempr.cod_pais]. Only one may be defined as writable, all others must be specified read-only.
Mapping: oracle.toplink.essentials.mappings.OneToOneMapping[codPais]
Descriptor: RelationalDescriptor(br.com.mercur.th.model.DocumenCandempr --> [DatabaseTable(documen_candempr)])
Runtime Exceptions:
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:473)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:405)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:722)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:604)
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229)
... 5 more
Java Result: 1
[/code]
E essa exception se repete para cada classe que se relaciona com a classe Pais.
Porem, pesquisando no Google vi que o pessoal coloca INSERTABLE=FALSE e UPDATABLE=FALSE. E ai que comeca a minha dor de cabeca…
Ao fazer isso, quando seto na numa classe um Pais, este nao é persistido. O JPA simplesmente coloca NULL no campo que relaciona com Pais.
O que pode ser isso?
Aqui vai as minhas classes:
[code]
@Entity
@Table(name = "documen_candempr")
@NamedQueries({})
public class DocumenCandempr implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "cdn_candempr", nullable = false)
private Integer cdnCandempr;
…
…
@JoinColumn(name = "cod_pais", referencedColumnName = "cod_pais")
@ManyToOne
private RhPais codPais;
get e set
}[/code]
@Entity
@Table(name = "rh_pais")
@NamedQueries({
@NamedQuery(name="RhPais.selectAll", query="SELECT r FROM RhPais r ORDER BY r.nomPais")
})
public class RhPais implements Serializable {
@Id
@Column(name = "cod_pais", nullable = false)
private String codPais;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "codPais")
private Collection<DocumenCandempr> documenCandemprCollection;
...
get e sets
}
Classe de teste
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "TH-CurriculuPU" );
EntityManager em = emf.createEntityManager();
RhPais pais = em.find(RhPais.class, "BRA");
DocumenCandempr documentoCandidato = new DocumenCandempr( 11 );
documentoCandidato.setCodPais(pais);
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(documentoCandidato);
transaction.commit();
Alguma segestão?