Tengo el siguiente problema al intentar actualizar mi entidad:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
Tengo una entidad principal y tiene una Set<...>
de algunas entidades secundarias. Cuando intento actualizarlo, obtengo todas las referencias que se establecerán en estas colecciones y lo configuro.
El siguiente código representa mi mapeo:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
He tratado de limpiar el Set <..> solamente, de acuerdo con esto: Cómo "posible" resolver el problema, pero no funcionó.
Si tiene alguna idea, hágamelo saber.
¡Gracias!
java
hibernate
hibernate-mapping
axcdnt
fuente
fuente
something.manyother.remove(other)
ifmanyother
es aList<T>
. Hacer muchos otros mutables, comoArrayList<T>
y usarorphanDelete = true
Respuestas:
Verifique todos los lugares donde está asignando algo a sonEntities. El enlace al que hizo referencia señala claramente la creación de un nuevo HashSet, pero puede tener este error cada vez que reasigna el conjunto. Por ejemplo:
Por lo general, solo desea "nuevo" el conjunto una vez en un constructor. Cada vez que desee agregar o eliminar algo a la lista, debe modificar el contenido de la lista en lugar de asignar una nueva lista.
Para agregar niños:
Para eliminar niños:
fuente
El método:
funciona si
parentEntity
está separado y nuevamente si lo actualizamos.Pero si la entidad no está separada de cada contexto (es decir, las operaciones de búsqueda y actualización están en la misma transacción), el método siguiente funciona.
fuente
Cuando leí en varios lugares que a Hibernate no le gustaba que asignaras a una colección, supuse que lo más seguro sería, por supuesto, hacerla final así:
Sin embargo, esto no funciona, y obtiene el temido error "ya no se hace referencia", que en realidad es bastante engañoso en este caso.
Resulta que hibernate llama a su método setRoles Y quiere que su clase de colección especial esté instalada aquí, y no aceptará su clase de colección. Esto me dejó perplejo por MUCHO tiempo, a pesar de leer todas las advertencias sobre no asignar a su colección en su método establecido.
Entonces cambié a esto:
Para que en la primera llamada, hibernate instale su clase especial, y en las llamadas posteriores puede usar el método usted mismo sin destruir todo. Si desea utilizar su clase como un bean, probablemente necesite un setter que funcione, y esto al menos parece funcionar.
fuente
List<String> list = new ArrayList<>();
. Cambiarlo paraList<String> list = null;
solucionar el problema :)En realidad, mi problema era sobre iguales y hashcode de mis entidades. Un código heredado puede traer muchos problemas, nunca olvides revisarlo. Todo lo que hice fue mantener la estrategia de borrar huérfanos y corregir los iguales y el código hash.
fuente
Yo tenía el mismo error. El problema para mí era que, después de guardar la entidad, la colección asignada seguía siendo nula y cuando intentaba actualizar la entidad se generaba la excepción. Lo que me ayudó: Guardar la entidad, luego hacer una actualización (la colección ya no es nula) y luego realizar la actualización. Tal vez inicializar la colección con el nuevo ArrayList () o algo podría ayudar también.
fuente
TIENE TIPO DE RELACIÓN:
No intentes crear una instancia de la colección cuando esté declarada
hasMany
, solo agrega y elimina objetos.TIPO DE RELACIÓN DE USO:
Pero la colección podría ser nula solo cuando se declara como una propiedad (relación de uso) y no se inicializa en la declaración.
fuente
Utilicé el enfoque @ user2709454 con una pequeña mejora.
fuente
Tuve este problema al intentar usar
TreeSet
. InicialicéoneToMany
conTreeSet
qué obrasPero, esto traerá el error descrito en lo
question
anterior. Entonces parece que eshibernate
compatibleSortedSet
y si uno solo cambia la línea de arriba afunciona como magia :) más información sobre
hibernate SortedSet
puede estar aquífuente
La única vez que recibo este error es cuando intento pasar NULL al setter para la colección. Para evitar esto, mis setters se ven así:
fuente
Me encontré con esto al actualizar una entidad con una solicitud de publicación JSON. El error ocurrió cuando actualicé la entidad sin datos sobre los hijos, incluso cuando no había ninguno. Agregando
El cuerpo de la solicitud resolvió el problema.
fuente
Otra causa puede estar usando lombok.
@Builder
- hace que se guardeCollections.emptyList()
incluso si dices.myCollection(new ArrayList());
@Singular
- ignora los valores predeterminados de nivel de clase y deja el camponull
incluso si el campo de clase se declaró comomyCollection = new ArrayList()
Mis 2 centavos, solo pasé 2 horas con lo mismo :)
fuente
Me estaba poniendo
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
cuando estaba configurandoparent.setChildren(new ArrayList<>())
. Cuando cambié aparent.getChildren().clear()
, resolvió el problema.Verifique para más detalles: HibernateException - La colección propietaria ya no hizo referencia a una colección con cascade = "all-delete-huérfano" .
fuente
Estoy usando Spring Boot y tuve este problema con una colección, a pesar de no sobrescribirlo directamente, porque estoy declarando un campo adicional para la misma colección con un serializador y deserializador personalizado para proporcionar una representación más amigable de la interfaz. datos:
Parece que aunque no estoy sobrescribiendo la colección yo mismo , la deserialización lo hace bajo el capó, desencadenando este problema de todos modos. La solución fue cambiar el setter asociado con el deserializador para que borre la lista y agregue todo, en lugar de sobrescribirlo:
fuente
Tuve el mismo problema, pero fue cuando el conjunto era nulo. Solo en la colección Establecer en el trabajo de búsqueda de lista. Puede intentar la anotación de hibernación @LazyCollection (LazyCollectionOption.FALSE) en lugar de la anotación JPA fetch = FetchType.EAGER.
Mi solución: esta es mi configuración y funciona bien
fuente
Experimenté el mismo error cuando estaba agregando objetos secundarios a la lista existente de objetos secundarios.
Lo que resolvió mi problema está cambiando a:
Ahora el niño también revive con otros detalles y funcionó bien.
fuente
Agregando mi tonta respuesta. Estamos usando Spring Data Rest. Esta fue nuestra relación bastante estándar. El patrón se usó en otro lugar.
Con la relación que creamos, siempre se pretendía que los niños se agregaran a través de su propio repositorio. Todavía no había agregado el repositorio. La prueba de integración que tuvimos fue a través de un ciclo de vida completo de la entidad a través de llamadas REST para que las transacciones se cerraran entre las solicitudes. Ningún repositorio para el niño significaba que el json tenía a los niños como parte de la estructura principal en lugar de dentro
_embedded
. Las actualizaciones a los padres causarían problemas.fuente
La siguiente solución funcionó para mí
fuente
En lugar de asignar una nueva colección
Reemplace todos los elementos con
fuente
ten cuidado con
Este método también rompe la hibernación.
fuente
Puede ser causado por
hibernate-enhance-maven-plugin
. Cuando habilité laenableLazyInitialization
propiedad, esta excepción comenzó a suceder en mi colección perezosa. Estoy usando hibernate 5.2.17.Final.Tenga en cuenta estos dos problemas de hibernación:
fuente
¡El mío fue completamente diferente con Spring Boot! Para mí no se debió a la configuración de la propiedad de colección.
¡En mis pruebas estaba tratando de crear una entidad y estaba recibiendo este error para otra colección que no se usó!
Después de tanto intentarlo, simplemente agregué un
@Transactional
método de prueba y lo resolvió. Sin embargo, no la razón.fuente
Esto está en contraste con las respuestas anteriores, tuve exactamente el mismo error: "Una colección con cascade =" all-delete-huérfano "ya no estaba referenciada ..." cuando mi función de configuración se veía así:
Y luego desapareció cuando lo cambié a la versión simple:
(versiones de hibernación: probé 5.4.10 y 4.3.11. Pasé varios días probando todo tipo de soluciones antes de volver a la tarea simple en el setter. Ahora estoy confundido sobre por qué esto es así).
fuente