622 votos

Cómo solucionar el error de Hibernate "object references an unsaved transient instance - save the transient instance before flushing" (el objeto hace referencia a una instancia transitoria

Recibo el siguiente error cuando guardo el objeto utilizando Hibernate

object references an unsaved transient instance - save the transient instance before flushing

819voto

Bozho Puntos 273663

Debe incluir cascade="all" (si utiliza xml) o cascade=CascadeType.ALL (si utiliza anotaciones) en la asignación de su colección.

Esto ocurre porque tienes una colección en tu entidad, y esa colección tiene uno o más elementos que no están presentes en la base de datos. Especificando las opciones anteriores le dices a hibernate que los guarde en la base de datos cuando guarde su padre.

254voto

McDonald Noland Puntos 161

Creo que esto podría ser sólo repetir la respuesta, pero sólo para aclarar, me dieron esto en un @OneToOne así como una @OneToMany . En ambos casos, fue el hecho de que el Child que estaba añadiendo al Parent aún no se ha guardado en la base de datos. Así que cuando añadí el Child a la Parent y luego guardó el Parent Hibernate tiraría el "object references an unsaved transient instance - save the transient instance before flushing" al guardar el Padre.

Añadiendo en el cascade = {CascadeType.ALL} en el Parent's referencia a la Child solucionó el problema en ambos casos. Esto salvó el Child y el Parent .

Perdón por la repetición de respuestas, sólo quería aclarar más para la gente.

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "performancelog_id")
public PerformanceLog getPerformanceLog() {
    return performanceLog;
}

68voto

Smithy Puntos 141

Esto ocurre al guardar un objeto cuando Hibernate piensa que necesita guardar un objeto que está asociado con el que está guardando.

Tenía este problema y no quería guardar los cambios en el objeto referenciado por lo que quería que el tipo de cascada fuera NINGUNO.

El truco consiste en asegurarse de que el ID y la VERSIÓN del objeto referenciado se establecen de forma que Hibernate no piense que el objeto referenciado es un objeto nuevo que necesita guardarse. Esto me ha funcionado.

Revisa todas las relaciones de la clase que estás guardando para averiguar los objetos asociados (y los objetos asociados de los objetos asociados) y asegúrate de que el ID y la VERSIÓN están establecidos en todos los objetos del árbol de objetos.

30voto

Haris Osmanagić Puntos 407

O, si desea utilizar "poderes" mínimos (por ejemplo, si no desea una eliminación en cascada) para lograr lo que desea, utilice

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

...

@Cascade({CascadeType.SAVE_UPDATE})
private Set<Child> children;

11voto

nanospeck Puntos 357

Esta no es la única razón del error. Acabo de encontrarlo por un error tipográfico en mi codificación, que creo, estableció un valor de una entidad que ya estaba guardada.

X x2 = new X();
x.setXid(memberid); // Error happened here - x was a previous global entity I created earlier
Y.setX(x2);

Detecté el error encontrando exactamente qué variable causaba el error (en este caso String xid ). He utilizado un catch alrededor de todo el bloque de código que guardó la entidad e imprimió las trazas.

{
   code block that performed the operation
} catch (Exception e) {
   e.printStackTrace(); // put a break-point here and inspect the 'e'
   return ERROR;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X