Hibernate AUTO FLUSH [RESOLVIDO]

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.

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

Eu estou usando o TransactionManager do Spring







PROPAGATION_REQUIRED, readOnly
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED


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

[code]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
[/code]

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…

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)?

[quote=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)?[/quote]

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

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 .

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…

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.

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

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