dúvida: duplicidade gerando NonUniqueObjectException

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

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
aureliorodrigues@gmail.com

poderia me dar um exemplo?

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
aureliorodrigues@gmail.com