dúvida: duplicidade gerando NonUniqueObjectException

3 respostas
crixtiano

Minha dúvida diz referência a isso:

Tenho dois objetos: A e B:

===============================

class A {

private B b;

private ArrayList blist;
public void setB(B b) {
            this.b = b;
    }

    public void addB(B b) {
            blist.add(b);   
    }

}

Muito bem, estou lendo esses objetos no banco de dados dessa forma:

===============================
A a = new A();

//Abro sessao Hibernate

b1 = servico.getB(1);

a.setB(b1);

//Fecho sessao Hibernate
//Faço um monte de coisa... bla bla bla...
//Abro sessao Hibernate

b1 = servico.getB(1);

a.addB(b1);

//Fecho sessao Hibernate
//Faço um monte de coisa... bla bla bla...

//Abro sessao Hibernate
servico.gravaA(a);
//Fecho sessao Hibernate

Muito bem, nessa linha ai acima “servico.gravaA(a);” está dando um erro
do Hibernate dessa forma:

===============================
Caused by: org.hibernate.NonUniqueObjectException: a different object
with the same identifier value was already associated with the session:
[B#1]

Enfim, o Hibernate está acusando , na hora de gravar o objeto “A” que
diferentes objetos do tipo “B” tem o mesmo identificador. No entanto, é
isso mesmo que eu quero, ou seja, o objeto A eventualmente pode ter o
objeto B (com o mesmo código) gravado no ArrayList e também gravado na
variável private “b”. Mas o Hibernate está dizendo “ei, êpa! tem dois
’B’ aqui com o mesmo código”.

Eu pensei que o próprio Hibernate verificasse, no caso acima, que B
tivesse o mesmo código e gravasse apenas uma única instância.

Então…, como fazer para gravar o objeto “A” no banco de dados tendo
ele o objeto B de código 1 gravado de duas formas no mesmo objeto?

Obrigado

Cristiano

3 Respostas

albama

Tenta dar um flush ( mandar descarregar o que está na memória ), lembre que isso tem um custo de performance.

Acredito que ele o que ele lê no banco é diferente do que está na memória, por isso dá esse erro.

Após cada transação manda o hibernate persistir de verdade ( dá a descarga " flush").

Marco Aurélio
[email removido]

crixtiano

poderia me dar um exemplo?

albama

Bem estou usando a implementação JPA do hibernate

No meu caso

eu crio o gerenciado de entidades

@PersistenceContext
	private EntityManager manager;

Persisto e dou o flush

//persiste
 	    manager.persist(hierarquia);
            
            // descarrega 
 	    manager.flush();

Aqui eu não tenho o a sintaxe do hibernate, só em casa, mas se você pesquisar na web tem bastante artigos a respeito desse assunto.

Marco Aurélio
[email removido]

Criado 27 de janeiro de 2009
Ultima resposta 27 de jan. de 2009
Respostas 3
Participantes 2