Hibernate - update chave primária

7 respostas
B

Olá pessoal, eu estou iniciando em hibernate e me deparei com um problema. Criei uma chave composta através de composite-id e vi que não consigo realizar o update desta chave, somente dos campos que estão setados como property.

Alguém conhece alguma maneira de contornar isso? O método que estou usando para realizar o update é:

session.update(ObjetoNovo, ObjetoAntigo)

O objeto antigo possui todos os dados do registro no banco, a serem alterados pelos dados do objeto novo. A saída apresentada pelo hibernate realiza update nos campos, mas não faz para os valores da chave composta :shock:

7 Respostas

Abdon

eu uso este metodo:

protected void saveOrUpdate(Object obj) throws HibernateException {
        
		Session session = HibernateUtil.currentSession();
        try {
            
            Transaction transaction = session.beginTransaction();
            session.saveOrUpdate(obj);
            
			transaction.commit();
            session.flush();
			
			session.refresh(obj);

            
        } catch (HibernateException e) {
			Debug.log(this,e.getMessage());
            throw e;
        } 
        
    }

Ele funciona desde que o objeto que vc esta fazendo o update seja o mesmo que esta na sessão do hibernate! Senão da erro =((

B

O problema nem é pegar registro por registro pra dar update, o problema é fazer o update nos capos que compõem a chave composta. Olha como aparece a saída no hibernate:

update item_catalogo set nome=?, nome_exibicao=?, ordem=? where valor=? and id_catalogo=?

O que eu quero é que o hibernate execute da seguinte maneira:

update item_catalogo set nome=?, nome_exibicao=?, ordem=?, valor=?, id_catalogo=? where valor=? and id_catalogo=?

Alguma sugerstão?

pascoajr

bono… explica melhor a situação… pq alterar a chave… mesmo que seja uma composite id pode ser arriscado!

algumas coisas que vamos fazer em um banco de dados tem que ser cuidadosamente estudada! não é só sair dando um update!

mandae… :wink:

B

Tá certo, vou mostrar a minha situação.

Eu tenho uma classe chamada Catalogo, que corresponde à tabela catalogo do bd. Da mesma maneira, tenho ItemCatalogo para item_catalogo. Catalogo contém id e nome. ItemCatalogo contém valor, id_catalogo e descricao. Id_catalogo é uma referência de Catalogo. A chave primária (pk) de item_catalogo é uma chave composta, cdos camos Id_catalogo e valor.

Na minha aplicação, eu listo através de uma combo todos os catálogos registrados da minha aplicação, para que eu possa permitir ao usuário alterar o catálogo a que o item de catálogo se refere. Desta maneira, evita-se inconsistências. O campo valor pode ser qualquer valor que o usuário queira entrar, de qualquer tipo. Este valor é tido como uma String.

O problema é que o hibernate não consegue atualizar os campos valor e id_catalogo, pois são compostos pela chave primária, onde não há problemas manipulá-los.

Agora que expliquei o problema, tem alguma sugestão para resolver esse impasse? Agradeço qualquer ajuda 8)

pascoajr

tudo bem… apesar de não concordar com a estrutura do banco de dados… (pra que colocar o campo valor como pk junto com idcatalogo?)
acho que vc pode tentar o seguinte:
copia o objeto que está persistido o qual vc quer alterar… deleta o mesmo e depois grava essa copia como se fosse um novo objeto…

algo assim:

1 - obter objeto persistido;

2 - fazer uma cópia (para um obj temp por exemplo);

3 - deletar o objeto que vc carregou;

4 - persistir o objeto que vc copiou no item 2 com as alterações necessárias!

ajudei???
espero que sim!

ah… tente modelar o item do catalogo com uma chave independente do catalogo e colocar uma fk que vai referenciar o catálogo ao qual ele pertence! eu faria assim!!!

valew!!

B

deletar o objeto persistido, vc quer dizer utilizar session.delete(objetoAntigo)? Se fôr, eu não queria proceder desta maneira.

Me dá um exemplo prático se não é isso, na moral, não entendi bem, usando apenas o update ou saveOrUpdateCopy.

Valeu brother!

pascoajr

tente usar… ao invés de save ou saveorupdate… um merge(objeto).

Criado 19 de agosto de 2005
Ultima resposta 19 de ago. de 2005
Respostas 7
Participantes 3