Dficiculdade com mapeamentos

2 respostas
F

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:
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

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

2 Respostas

F

Alguem?

L

Galera preciso que alguém me ajude… Estou precisando de um código em java que calcule o endereço do ip para saber se da classe A, B, C, D ou E, qtdade de hosts e subredes que este endereço possui…
Alguém que souber de algum material por valor me ajude… Valeu!!!

Criado 30 de maio de 2008
Ultima resposta 1 de jun. de 2008
Respostas 2
Participantes 2