dúvida merge jpa2

32 views
Skip to first unread message

Gabriel Aguena

unread,
Sep 21, 2011, 4:06:16 PM9/21/11
to hibernat...@googlegroups.com
Olá Galera, então sempre utilizei a Session do Hibernate, agora estou
tendo que utilizar o EntityManager (jpa2).
Ai é o seguinte, no hibernate com a session utilizava o saveOrUpdate,
este me retornava a PK da entidade assim que entrava em estado Manager
após o insert.
O Problema é que com o Merge isso não está ocorrendo,na verdade ele
faz o insert, mas como não me devolveu o PK e o proximo merge é um
insert e não um update.

Alguém já passou por isso?
Abs

Enio Nunes

unread,
Sep 22, 2011, 8:00:04 AM9/22/11
to hibernat...@googlegroups.com
Cara, esse metodo que escrevo funciona aqui tanto com hibernate quanto com toplinl da uma olhada:

  public T salvar(T object) {
        EntityTransaction tx = entityManager.getTransaction();
        try {
            tx.begin();
            object = entityManager.merge(object);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return object;
    }



--
Você está recebendo esta mensagem porque se inscreveu no grupo "Hibernate Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para hibernat...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para hibernate-bras...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/hibernate-brasil?hl=pt-BR.


Henrique Moreira Lustosa Dourado

unread,
Sep 22, 2011, 7:53:47 AM9/22/11
to hibernat...@googlegroups.com
Eae Gabriel. Não sei se entendi, mas na hora de salvar eu faço assim:


public int save(T unsaved) throws Exception {
        try {
            if (unsaved.getId() == null) {
                manager.persist(unsaved);
                ftem.index(unsaved);                
            } else {
                manager.merge(unsaved);
                ftem.merge(unsaved);
                return manager.getReference(T.class, unsave.getId());
            }
        } catch (RuntimeException e) {
            System.out.println(e.getCause());
            throw new DAOException(e);
        }
        return 0;
    }

Passo a entidade ao método e verifico se o id tá null e, se tiver chamo o método persist do mananger e caso contrário o merge e retorno o id.

   Bom espero ter ajudado!!

   Flwsss. 

--
Att,

Henrique Moreira Lustosa Dourado
Técnico em Tecnologia da Informação
Produtos, Serviços e Assistência Técnica em Informática


Tel.: (63) 3313-3103/3232-8185
Cel.: (63) 8448 - 4043
E-mail: henriq...@gmail.com
MSN:   henriq...@hotmail.com

Gabriel Magaton

unread,
Sep 22, 2011, 6:01:13 PM9/22/11
to hibernat...@googlegroups.com
Manda sua entidade.

gabriel aguena

unread,
Sep 23, 2011, 6:42:55 AM9/23/11
to hibernat...@googlegroups.com
Vi no site da Caelum que o merge retorna o objeto:
"

Por isso o método é o merge. Ele junta a possível entidade com mesmo id que se encontra no EntityManager com a passada como argumento, e devolve a que está managed. O método merge não faz reattach. Então:

Cliente c = new Cliente();
c.setId(1);
em.merge(c);
c.setNome("Cliente com nome alterado");

Não surtirá efeito! Aqui você precisava antes ter pego o que o merge devolveu. Repare na pequena alteração:

Cliente c = new Cliente();
c.setId(1);
c = em.merge(c);
c.setNome("Cliente com nome alterado");

[CAELUM - http://blog.caelum.com.br/entidades-managed-transient-e-detached-no-hibernate-e-jpa/]


abraços



Reply all
Reply to author
Forward
0 new messages