Se encontraron referencias compartidas a una colección org.hibernate.HibernateException

Recibí este mensaje de error:

error: se encontraron referencias compartidas a una colección: Person.relatedPersons

Cuando intenté ejecutar addToRelatedPersons(anotherPerson) :

 person.addToRelatedPersons(anotherPerson); anotherPerson.addToRelatedPersons(person); anotherPerson.save(); person.save(); 

Mi dominio:

 Person { static hasMany = [relatedPersons:Person]; } 

alguna idea de por qué sucede esto?

Hibernate muestra este error cuando intenta persistir más de una instancia de entidad que comparte la misma referencia de colección (es decir, la identidad de la colección en contraste con la igualdad de la colección).

Tenga en cuenta que significa la misma colección , no el elemento de recostackción; en otras palabras, las personas relatedPersons en una person y anotherPerson person deben ser iguales. Tal vez está restableciendo esa colección después de que las entidades se cargan? ¿O ha inicializado ambas referencias con la misma instancia de recostackción?

Yo tuve el mismo problema. En mi caso, el problema fue que alguien usó BeanUtils para copiar las propiedades de una entidad a otra, así que terminamos teniendo dos entidades haciendo referencia a la misma colección.

Dado que pasé un tiempo investigando este problema, recomendaría la siguiente lista de verificación:

  • Busque escenarios como entity1.setCollection(entity2.getCollection()) y getCollection devuelve la referencia interna a la colección (si getCollection () devuelve una nueva instancia de la colección, entonces no necesita preocuparse).

  • Mira si clone() se ha implementado correctamente.

  • Busque BeanUtils.copyProperties(entity1, entity2) .

Explicación en la práctica. Si intenta guardar su objeto, por ejemplo:

 Set folders = message.getFolders(); folders.remove(inputFolder); folders.add(trashFolder); message.setFiles(folders); MESSAGESDAO.getMessageDAO().save(message); 

no es necesario que configure el objeto actualizado en un objeto primario:

 message.setFiles(folders); 

Simple, guarde su objeto padre como:

 Set folders = message.getFolders(); folders.remove(inputFolder); folders.add(trashFolder); // Not set updated object here MESSAGESDAO.getMessageDAO().save(message); 

En mi caso, estaba copiando y pegando código de mis otras clases, así que no noté que el código getter estaba mal escrito:

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "credito") public Set getConceptoses() { return this.letrases; } public void setConceptoses(Set conceptoses) { this.conceptoses = conceptoses; } 

Todos los conceptos de las referencias, pero si nos fijamos en el obtener dice letras

Leer en línea la causa de este error también puede ser un error de hibernación , como solución alternativa que parece funcionar, es poner un:

 session.clear() 

Debes dejar el mensaje claro después de obtener los datos y antes de confirmar y cerrar, ver ejemplo:

 //getting data SrReq sr = (SrReq) crit.uniqueResult(); SrSalesDetailDTO dt=SrSalesDetailMapper.INSTANCE.map(sr); //CLEAR session.clear(); //close session session.getTransaction().commit(); session.close(); return dt; 

Utilizo esta solución para seleccionar la base de datos, actualizar o insertar, no sé si esta solución puede funcionar o puede causar problemas.

Mi problema es igual al 100% de esto: http://www.progtown.com/topic128073-hibernate-many-to-many-on-two-tables.html

Yo también tuve el mismo problema, alguien usó BeanUtils.copyProperties(source, target) . Aquí tanto el origen como el objective usan la misma colección que el atributo.

Así que acabo de usar la copia profunda como abajo …

Cómo clonar la colección en Java: copia profunda de ArrayList y HashSet

Enfrenté una excepción similar en mi solicitud. Después de buscar en la stack de stack, quedó claro que se lanzó una excepción dentro de una clase FlushEntityEventListener .

En Hibernate 4.3.7, el bean MSLocalSessionFactory ya no admite la propiedad eventListeners . Por lo tanto, uno tiene que obtener explícitamente el registro de servicio de beans de sesión de Hibernate individuales y luego establecer los oyentes de eventos personalizados requeridos.

En el proceso de agregar oyentes de eventos personalizados, debemos asegurarnos de que los oyentes de eventos predeterminados correspondientes se eliminen de la sesión de Hibernate correspondiente.

Si el detector de eventos predeterminado no se elimina, entonces se presenta el caso de dos oyentes de eventos registrados contra el mismo evento. En este caso, al iterar sobre estos oyentes, frente a los primeros oyentes, las colecciones de la sesión se marcarán como alcanzadas y, al procesar la misma colección contra el segundo oyente, arrojarán esta excepción de Hibernate.

Por lo tanto, asegúrese de que al registrar oyentes personalizados, los oyentes predeterminados correspondientes se eliminen del registro.

Considera una entidad:

 public class Foo{ private user; /* with getters and setters */ } 

Y considere una clase de lógica de negocios:

 class Foo1{ List user = new ArrayList<>(); user = foo.getUser(); } 

Aquí el usuario y foo.getUser() comparten la misma referencia. Pero salvar las dos referencias crea un conflicto.

El uso correcto debería ser:

 class Foo1 { List user = new ArrayList<>(); user.addAll(foo.getUser); } 

Esto evita el conflicto.

Intereting Posts