HIBERNATE - update erradamente

13 respostas
viniciuspadua

estou com uma dúvida.
Meu hibernate esta atualiza um bean mesmo sem eu pedir explicitamente para esse bean ser atualizado.

por exemplo:
Criei um interceptador e antes de iniciar a action eu abro uma transação e após a action eu fecho a transação!
entretanto quando altera o dado de um bean e não faço o commit ele mesmo assim esta alterando no banco!
pq ?

13 Respostas

CintiaDR

Será que não está configurado para dar autocommit?

Tentou dar pelo menos um rollback para ver se a alteração não é feita?

viniciuspadua

não esta em autocomit.

<property name="hibernate.connection.autocommit">false</property>

se der roolback não ocorre.
mais queria que o commit funcionasse apenas nos beans que solicitei e não em todos que foram alterados.

CintiaDR

Pera, creio que eu não entendi direito.

Vc altera o bean “B”, dá save e commit ele salva B, C e D???

Explica bem melhor que eu nem sei qeu dados vc manipulou, quais ou filhos, quem vc persistiu, as relações, os cascades, etc etc.

viniciuspadua

Seguinte:
Tenho 3 beans (A, B e C). sem relação entre eles!

  1. Inicio a Transação
  2. Altero os 3 beans
  3. Verifico algumas condição
  4. Devido as condições somente solicito update no B
  5. Finalizo a transação (commit)

Entretanto ocorre os update em todos os beans. Ou seja, ocorre o update nos beans mesmo que não faça o update(A) e update©

CintiaDR

:shock:

Nunca tentei fazer isso. Claro, uma hipótese seria vc “reload” os beans A e C, mas não é o melhor, né?
Tem como deixar uma entidade “detached” na mão?

Jair_Rillo_Junior

Esse é o comportamento padrão do ORM quando está dentro de uma transação. Se ele vê que a sua entidade foi alterada em memória, ele irá persistir essas alterações no banco de dados. O mesmo ocorre com JPA.

CintiaDR

Quer dizer que o “update” é redundante?

Vc podia me passar documentação sobre isso?

viniciuspadua

como faço para deixar a entidade detached e depois mudar para managed?

CintiaDR

Vinícius,

Entrei com nenhuma dúvida nesse tópico e saí com umas 5… :oops:

viniciuspadua

eu descobri por acaso isso.
como uso muito o .trim() em todo get() de string estou conferindo se ocorre vários update.
se for o desempenho cairá demais!

Jair_Rillo_Junior

Você não consegue deixar apenas 1 objeto detached. Você pode fechar a sessão e todos os objetos “pendurados” nessa sessão ficarão detached.
Para voltar managed, você pode usar o método merge() do Hibernate.

Cinthia
No site oficial do Hibernate deve ter algo falando sobre isso. O trabalho do hibernate é manter os objetos em memória (managed) igual os dados persistidos. Não pense no hibernate como um simples framework de persistência que você chama save(), update(), delete e ele vai fazer as ações no banco de dados SÓ NESSE INSTANTE. No google deve ter algo a mais comentando a respeito

Jair_Rillo_Junior

viniciuspadua:
eu descobri por acaso isso.
como uso muito o .trim() em todo get() de string estou conferindo se ocorre vários update.
se for o desempenho cairá demais!

Se o conteúdo for modificado e o objeto managed, o Hibernate vai fazer um update por trás dos panos sim.

É igual quando você trabalha com objetos one-to-many. Supondo que você tem um objeto estado e nele tem uma lista de cidades. Você carregou o objeto estado e quer excluir todas as cidades. Para fazer isso, simplesmente faça via objeto

objetoEstado.getListaCidades().clear();

Por trás dos panos vai acontecer o delete

CintiaDR

Jair,

estou procurando agorinha mesmo sobre isso, mas decerto não estou conseguindo palavras chaves concisas o suficiente.

Meu ponto unicamente era unicamente para que serviria o update, já que o hibernate salva os “managed objects” modificados automaticamente. Acho que a resposta é essa:

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#update(java.lang.Object)

O Update recebe uma detached instance…

Criado 2 de junho de 2009
Ultima resposta 2 de jun. de 2009
Respostas 13
Participantes 3