Hibernate AUTO FLUSH [RESOLVIDO]

11 respostas
D

Olá,
Gostaria de configurar o hibernate para detectar automaticamente que um objeto persistente foi alterado na app, e ja executar o update, EX:

Produto produto = (Produto)ctrlProduto.buscarProduto(id);

produto.setNome(“TESTE”);

// ai ja executar o flush automaticamente pois o atributo nome foi alterado
// sem nescessidade de executar a linha abaixo:
// ctrlProduto.atualizarProduto(produto);

// configurei estas opções mas não teve resultado:

auto
true
true
false

Obrigado.

11 Respostas

Lavieri

para não ter q escrever um sabe e tc… é preciso executar sobre escopode tranzação…

D

Eu estou usando o TransactionManager do Spring







PROPAGATION_REQUIRED, readOnly
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED


Andre_Brito

O merge do Hibernate não faz esse flush não?

Lavieri
Andre Brito:
O merge do Hibernate não faz esse flush não?

se vc estiver em um ambiente tranzacional, e tiver usando uma entidade gerenciada, o marge não é necessário, por exemplo

em.getTrasaction().begin();

Produto p = em.find(Produto.class,15); //p é uma entidade gerenciada
p.setPreco(1050); 

em.getTransaction().commit(); //a atualização do preço vai para o banco mesmo sem o marge

Não é necessário o marge, pois o preço foi retirado de um ambiente gerenciado, ou seja, quando vc da um serarch dentro de uma tranzação, o objeto vem gerenciado, e todos os updates vão para o banco, e no momento do commit() tudo deve sr confirmado e ir par ao banoc...

Andre_Brito

Lavieri,

Pois é. O flush acontece com a chamada de alguns métodos (o commit e o merge estão entre eles). Se for o caso, é só ele fazer o que o seu código faz mesmo.

Se eu usar namedQuery dá na mesma que usar o find (ou seja, ele me retorna um objeto já gerenciado ou ele é detached)?

Lavieri

Andre Brito:
Lavieri,

Pois é. O flush acontece com a chamada de alguns métodos (o commit e o merge estão entre eles). Se for o caso, é só ele fazer o que o seu código faz mesmo.

Se eu usar namedQuery dá na mesma que usar o find (ou seja, ele me retorna um objeto já gerenciado ou ele é detached)?

qualquer objeto trazido pelo EntityManager com tranzação aberta é gerenciado, ate a tranzação ser finalizada

D

Então, eu estou usando Struts + Spring + Hibernate, tenho gerenciado pelo Spring as: Actions -> Ctrls -> Daos, mas eu queria era automatizar isso, de modo que se eu alterasse um objeto na action, ele propagava para o banco sem ter que chamar nenhum metodo merge ou update, pois da action não tenho acesso a sessão, tenho que criar todo o fluxo de camadas até chegar ao DAO ex: “atualizar” ai esse metodo da Ctrl eu tenho acesso na action pois as Ctrls são injetadas nas actions. e os DAO são injetados nas Ctrls.
E meus DAOS extendem HibernateDAOSupport do Spring. eu acesso via getHibernateTemplate(); Existe sim um meio de configurar isso eu ja vi so não sei como .

Lavieri

No vraptor, eu uso um Interceptor para isso…

Vejo o fluxo que esta indo para uma logica (que no seu saco é uma action) … ai verifico se esta lógica esta anotada com um @Transaction (essa anotação eu q criei) quando esta, eu inicio uma tranzação e só ai chamo a lógica, executo a logica, e então commito a tranzação…

D

RESOLVIDO, o problema era mesmo o escopo da transação, eu estava alterando o objeto na action, enquanto somente as ctrls estavam no escopo de transação e somente os metodos iniciados com a key* marcados como Read/Write efetuam o update automatico do objeto quando alterados dentro do metodo sem a necessidade de chamar a camada de DAO:

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED

Obrigado a todos.

G

daniel-6-strings, só para complementar… se algum dia você quiser passar isso para annotations, o Spring possui a mesma configuração por elas via @Transactional. Há atributos para deixar o método como readonly e até alterar o isolation-level.

Abraços

D

Opa, cara nunca trabalhei com annotations, mas acho bem interessante pois elimina os .xml, é a tendência futura.

Criado 13 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 11
Participantes 4