Duas transações - passagem de dados de uma para outra (hibernate)

2 respostas
Grinvon

Estou com o seguinte problema:

Tenho dois bancos de dados:
[i]- SQL Server

  • Derby[/i]

A aplicação se conecta com ambos.

E tenho duas classes entidades:
[i]- Auditoria

  • Procedimento[/i]

A relação dessas classes é de 1-N. Ou seja: uma Auditoria poderá ter vários Procedimentos.

Eu abro a transação via EntityManager com o banco SQL Server e gravo várias auditorias com vários procedimentos, até aí tudo certo, persiste no banco com sucesso, o problema é quando abro duas transações (a primeira para ler as auditorias do SQL Server, a segunda para gravar as auditorias do SQL Server para o Derby) onde que na hora de persistir ele apenas persiste a auditoria, e os procedimentos relacionados com a auditoria não são gravados, não entendo por quê isso ocorre.

O método buildEntityList é o método que lê do as auditorias do banco remoto (SQL Server) e passa tudo para uma lista.

public List buildEntityList(Class pEntity) {
        List lModel = null;
        Query lQuery = emRemote.createQuery("SELECT m FROM " + pEntity.getSimpleName() + " m");
        lModel = lQuery.getResultList();
        return lModel;
    }

O método download lê o conteúdo da lista e persite o conteúdo no banco local (Derby).

public void download(List<ModelVersioning> pContent, Class pEntity) throws Exception {
        
        //verifica se não está nula e se não está vazia.
        if (pContent != null && !pContent.isEmpty()) {
            
            //varre toda a lista verificando se existe a mesma entidade no banco
            //local, caso exista ele será apagado e uma versão do banco remoto
            //será colocado em lugar.
            for (ModelVersioning lModel : pContent) {
                
                ModelVersioning model  = (ModelVersioning) emLocal.find(pEntity, lModel.getId());
                
                //if (lQuery != null  && !lQuery.getResultList().isEmpty()) {
                if (model != null && model.getId() != null) {
                    //há registro, então apaga o objeto no banco local.
                    System.out.println("$ Auditoria achada, removendo...");
                    emLocal.remove(emLocal.getReference(pEntity, lModel.getId()));
                }
                
                emLocal.merge(lModel);
                
            }
            emLocal.getTransaction().commit();
            
        }
    }

Há portanto dois EM. emRemote e emLocal

E ambas as classes de entidades herdam de ModelVersioning que é uma classe genérica para models do tipo.

Acredito que dessa forma era para persitir com sucesso no banco de dados local.

2 Respostas

J

Grinovon,

Qual o relacionamento entre essas tabelas ?

Grinvon

O relacionamento é 1-N.

Auditoria pode ter N Procedimentos

Dessa forma eu tenho um objeto lista em Auditoria que armazenará os procedimentos. E dentro da entidade Procedimento eu tenho um objeto de Auditoria.

Tenho portanto em Auditoria:

//coleção de procedimentos
    @OneToMany(mappedBy="auditoria", cascade=CascadeType.ALL)
    @JoinColumn(name="ADT_ID")
    private List<Procedimento> procedimentos;

E tenho em Procedimento:

@ManyToOne(targetEntity=Auditoria.class)
    @JoinColumn(name="ADT_ID")
    private Auditoria auditoria;
Criado 7 de janeiro de 2008
Ultima resposta 7 de jan. de 2008
Respostas 2
Participantes 2