Update diferencial no Hibernate

10 respostas
E

Boa tarde pessoal,

Quando faço uma ALTERAÇÃO em um pojo e passo pro Hibernate persistir, ele gera um update que contém todos os campos. Alguém sabe como fazer que ele gere um update apenas com os campos que foram alterados?

Para deixar o problema mais claro, vou colocar um exemplo:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="classId", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="-89999999999946")
public class Teste {
	
        @Id
        private int id      ;

	private String descricao;
	
	@Temporal(TemporalType.DATE)
	private Date data;	
	
	@MetaField(visible=true, order = 3, width = 50)
	private double preco;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(nullable=true)
	private Date hora;
	
	@Column(nullable=true)
	private Boolean executar;
		
}

//main
Session session = HibernateUtil.getSession();

Teste pojo = session.load(Teste.class, 1);
pojo.setDescricao("nova descrição");
session.merge(pojo);

Quando executo o “merge” gostaria que o sql gerado fosse “UPDATE TESTE SET DESCRICAO = ‘nova descrição’ WHERE ID = 1”, no entanto, é gerado um update em todos os campos, gerando um tráfego desnecessário na rede e um certo overhead no banco de dados.

Tendo em vista que aplicação que eu estou desenvolvendo trabalha com um volume de dados muito grande e muitos usuários fazendo alterações simultaneamente, isto realmente vai fazer uma grande diferença.

Alguma idéia???

Obrigado.

10 Respostas

Lavieri

Ideia ?? sim tenho

JavaBean… ProptyChangeListner … ai a partir dai, vc sabe só o q mudou, e pode alterar só oq ker, porem!!! se vai conseguir fazer isso via hibernate, é outros 500… mas a ideia ta ai

E

Lavieri:
Ideia ?? sim tenho

JavaBean… ProptyChangeListner … ai a partir dai, vc sabe só o q mudou, e pode alterar só oq ker, porem!!! se vai conseguir fazer isso via hibernate, é outros 500… mas a ideia ta ai

Cara, obrigado pela dica, consegui resolver outro problema com o sistema de auditoria que eu tinha usando isso, mas pra fazer o update diferencial usando o hibernate ainda to boiando, principalmente porque o site do hibernate ta fora do ar (junto com o fórum).

Vou continuar pesquisando, quando eu conseguir implementar monto um tutorial pra colocar no fórum.

TFAGUNDES6

Pode ser besteira oq eu estou falando, mais é uma ideia…
Quando vc monta um form vc não tem q buscar os dados
do objeto no banco e jogar na sessão !!(não sei se é assim q tu trabalha)
se for assim, e só comparar os dados da sessão antiga com os dados do form.
Sei tem algumas formas de fazer na unha !!!

Abraços…

E

TFAGUNDES6:
Pode ser besteira oq eu estou falando, mais é uma ideia…
Quando vc monta um form vc não tem q buscar os dados
do objeto no banco e jogar na sessão !!(não sei se é assim q tu trabalha)
se for assim, e só comparar os dados da sessão antiga com os dados do form.
Sei tem algumas formas de fazer na unha !!!

Abraços…

Mas como eu iria conseguir fazer o update diferencial dessa forma? lembrando que eu não posso abrir mão do hibernate…

TFAGUNDES6

Esquece o Hibernate…
Pra mim ele só trabalha com o Bd…
Faz os procesos para verificar se foi alterado
na unha e depois popula o objeto com os campos
salvos e manda o Hibernate salvar…
Bom dai vai variar da maneira de como tu trabalha…
Dependendo a gente não vai se entender mesmo!!rsrsr

Abraços…

E

TFAGUNDES6:
Esquece o Hibernate…
Pra mim ele só trabalha com o Bd…
Faz os procesos para verificar se foi alterado
na unha e depois popula o objeto com os campos
salvos e manda o Hibernate salvar…
Bom dai vai variar da maneira de como tu trabalha…
Dependendo a gente não vai se entender mesmo!!rsrsr

Abraços…

Cara, obrigado pela dica, mas não dá pra usar dessa forma, porque eu estou trabalhando em um framework pra integrar o extjs, gwt e o hibernate, por isso tem que ser uma solução genérica, de preferência usando somente JPA.

Abraço

TFAGUNDES6

Hum…Entendi
cara fiz uns teste aqui com ExtJs mais apanhei muito com esse cara
Bom aproveitando, uma duvida que eu tinha do Ext e postei no forum
mas ninguém respondeu…rsrs…Tu sabe com integerar componentes ??

Tipo eu tenho no meu layout nort um botão e gostaria de q quando eu
clicar no botão ele abrir uma aba com qualquer componente no center !!

Se tu tiver algum exemplo, eu agradeço…

Outra pergunta, é se tu trabalha a bastante tempo com ExtJs e gwt e se
trabalha é uma boa sair de struts ou jsf para isso ??

Abraços cara, valeu !!

Y

Aí pessoal aproveitando que vcs estão falando hibernate e gwt eu posso usar anotações do hibernate com gwt ou tenho de usar só o arquivo xml?
valew

B

Existe a propriedade dynamic-update no hibernate, que faz justamente o que você quer.

YvesCavalcanti:
Aí pessoal aproveitando que vcs estão falando hibernate e gwt eu posso usar anotações do hibernate com gwt ou tenho de usar só o arquivo xml?
valew

Sim, pode. Só não sequestre o tópico, crie um novo para suas dúvidas.

Y

Ok obrigado pela resposta, e desculpa pelo mal jeito, tomarei cuidado em não desviar o tópico.
valew

Criado 23 de abril de 2009
Ultima resposta 5 de jul. de 2009
Respostas 10
Participantes 5