Recibo el siguiente error cuando guardo el objeto utilizando Hibernate
object references an unsaved transient instance - save the transient instance before flushing
Recibo el siguiente error cuando guardo el objeto utilizando Hibernate
object references an unsaved transient instance - save the transient instance before flushing
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.
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;
}
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.
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 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.