Erro Hibernate

6 respostas
A

Olá. Estou desenvolvendo um projeto com Hibernate e venho enfrentando alguns problemas.
Tenho uma entidade que possui vários atributos do tipo List. Então para facilitar minha vida na hora de inserir valores e não precisar fazer um método para adicionar objetos em cada atributo eu fiz um método com Reflection que consegue pegar a Lista corrente e adicionar um novo item nela. No entanto quando vou persistir com saveOrUpdate, a aplicação gera uma exception.

List &lt Object &gt objList = ( List &lt Object &gt ) getMethod.invoke ( curriculo ); if ( ( objList == null ) || ( objList.size ( ) == 0 ) ) { objList = new ArrayList &lt Object &gt ( ); objList.add ( obj ); } else { boolean found = false; for ( Object object : objList ) { if ( ( ( Integer ) objGetIdMethod.invoke ( object ) ).equals ( ( Integer ) objGetIdMethod.invoke ( obj ) ) ) { objList.set ( objList.indexOf ( object ) , obj ); found = true; break; } } if ( !found ) objList.add ( obj ); } setMethod.invoke ( curriculo , objList ); DAO.saveOrUpdate ( curriculo );
Eu omiti as linhas que procuram pelos métodos a serem invocados. O objeto curriculo foi populado através de uma consulta, então eu chamo o getLista e jogo em minha lista, então eu procuro por um objeto que contenha o mesmo id que o que eu quero inserir ou alterar. Se encontrar ele troca os objetos, senão ele adiciona um novo na lista. Depois disso chamo o método setLista e coloco a lista atualizada e mando persistir.
Estou tendo o seguinte exception quando tento alterar esta lista:

Alguém pode me ajudar a consertar isso ou mesmo me indicar uma maneira melhor de fazer isto?

Obrigado.

6 Respostas

M

Olá,

Use o BeanUtils, nele você encontrará esta questão você está querendo… mas este problema aí é o seguinte: você obteve um objeto e criou outro e está tentando fazer um save/update. Inclua-o na sessão hibernate primeiro… como? session.merger(obj);

Caso os problemas persistirem, cole por favor, o código completo, pois está faltando muitas partes… aparentemente… e não está dando para ligar.

:okok:

A

Fiz diferente, eu estou alterando o objeto direto na lista em vez de substituí-lo.
No lugar de

Eu fiz isso.

int i = objList.indexOf ( object ); for ( Method method : object.getClass ( ).getMethods ( ) ) { if(method.getName ( ).startsWith ( "set" )) { Method method2 = object.getClass ( ).getDeclaredMethod ( "g"+method.getName ( ).substring ( 1 ) ); method.invoke ( objList.get ( i ) , method2.invoke ( obj ) ); } }
Talvez esta não seja a melhor maneira, mas precisava de uma solução com urgência e usei isto mesmo.
hehe
Vou tentar usar este merger aqui
vlw

M

Opa,

Hummmm não sei se esta é a melhor opção, não sei ao certo o que está fazendo, mas pelo que deu para entender, porque você não usa o cascade do Hibernate?

:okok:

A

Esse cascade a que você se refere é o que coloca no mapeamento?
Se for eu coloquei cacade all.

M

Então você não precisa deste script aí não, basta você usar os objetos dependentes através da entidade pai e dar um update nela. Que os objetos dependentes serão atualizados.

:joia:

A

Então você não precisa deste script aí não, basta você usar os objetos dependentes através da entidade pai e dar um update nela. Que os objetos dependentes serão atualizados.
Como assim? Não é o que estou fazendo? Peguei o objeto dependente do objeto pai atualizo ele e dou um saveOrUpdate. Mas como é uma lista, se eu adicionar um novo item ele não aceita dizendo que estou tentando atribuir um objeto diferente à sessão com o mesmo identificador.

Criado 9 de agosto de 2007
Ultima resposta 20 de ago. de 2007
Respostas 6
Participantes 2