logo for english java hibernate orm

java - for - hibernate jpa



el objeto hace referencia a una instancia transitoria no guardada-guarda la instancia transitoria antes de vaciar (23)

Caso 1: estaba obteniendo esta excepción cuando intentaba crear un padre y guardaba la referencia principal a su hijo y luego alguna otra consulta DELETE / UPDATE (JPQL). Así que simplemente descargo () la entidad recién creada después de crear el padre y después de crear el hijo usando la misma referencia del padre. Funcionó para mí.

Caso 2:

Clase de padres

public class Reference implements Serializable { @Id @Column(precision=20, scale=0) private BigInteger id; @Temporal(TemporalType.TIMESTAMP) private Date modifiedOn; @OneToOne(mappedBy="reference") private ReferenceAdditionalDetails refAddDetails; . . . }

Clase de niños:

public class ReferenceAdditionalDetails implements Serializable{ private static final long serialVersionUID = 1L; @Id @OneToOne @JoinColumn(name="reference",referencedColumnName="id") private Reference reference; private String preferedSector1; private String preferedSector2; . . }

En el caso anterior donde la relación padre (Referencia) y la secundaria (Referencia de datos adicionales) tienen una relación OneToOne y cuando intenta crear una entidad de referencia y luego su secundaria (Referencia de referencia adicional), le dará la misma excepción. Entonces, para evitar la excepción, debe establecer nulo para la clase secundaria y luego crear el padre. (Código de muestra)

. . reference.setRefAddDetails(null); reference = referenceDao.create(reference); entityManager.flush(); . .

Recibo el siguiente error cuando guardo el objeto utilizando Hibernate

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


Creo que es porque has intentado persistir un objeto que tiene una referencia a otro objeto que aún no es persistente, y por eso intenta en el "lado DB" poner una referencia a una fila que no existe


Creo que esto podría ser solo una respuesta repetida, pero solo para aclarar, obtuve esto en un mapeo de @OneToOne así como en un @OneToMany . En ambos casos, fue el hecho de que el objeto Child que estaba agregando al Parent no estaba guardado en la base de datos. Entonces, cuando agregué el Child al Parent , luego guardé el Parent , Hibernate lanzaría el "object references an unsaved transient instance - save the transient instance before flushing" guardada "object references an unsaved transient instance - save the transient instance before flushing" mensaje al guardar el padre.

Agregar en la cascade = {CascadeType.ALL} en la referencia Parent''s al Child resolvió el problema en ambos casos. Esto salvó al Child y al Parent .

Lo siento por cualquier respuesta repetida, solo quería aclarar más para la gente.

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


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

Esto sucede porque tiene una colección en su entidad y esa colección tiene uno o más elementos que no están presentes en la base de datos. Al especificar las opciones anteriores, le indica a Hibernate que las guarde en la base de datos al guardar su principal.


En mi caso, fue causado por no tener CascadeType en el lado @ManyToOne de la relación bidireccional. Para ser más precisos, tuve CascadeType.ALL en @OneToMany y no lo tenía en @ManyToOne . Agregar CascadeType.ALL a @ManyToOne resolvió el problema. Lado uno a muchos :

@OneToMany(cascade = CascadeType.ALL, mappedBy="globalConfig", orphanRemoval = true) private Set<GlobalConfigScope>gcScopeSet;

Lado de muchos a uno (causó el problema)

@ManyToOne @JoinColumn(name="global_config_id") private GlobalConfig globalConfig;

Muchos a uno (corregido agregando CascadeType.PERSIST )

@ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name="global_config_id") private GlobalConfig globalConfig;


Enfrenté esta excepción cuando no persistía el objeto principal pero estaba guardando el elemento secundario. Para resolver el problema, en la misma sesión persistí tanto en el objeto principal como en el secundario y utilicé CascadeType.ALL en el principal.


Esta no es la única razón para el error. Lo encontré justo ahora por un error tipográfico en mi codificación, que creo que, 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);

Descubrí el error al encontrar exactamente qué variable causó el error (en este caso, String xid ). Utilicé una catch alrededor de todo el bloque de código que guardó la entidad e imprimió las huellas.

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


Esto ocurrió para mí cuando persistía una entidad en la que el registro existente en la base de datos tenía un valor NULO para el campo anotado con @Version (para un bloqueo optimista). La actualización del valor NULL a 0 en la base de datos corrigió esto.


Esto sucede cuando se guarda un objeto cuando Hibernate cree que necesita guardar un objeto que está asociado con el objeto que está guardando.

Tuve este problema y no quería guardar los cambios en el objeto referenciado, así que quería que el tipo de cascada NINGUNO.

El truco es asegurarse de que el ID y la VERSIÓN en el objeto al que se hace referencia estén configurados de modo que Hibernate no piense que el objeto al que se hace referencia es un objeto nuevo que necesita ser guardado. Esto funcionó para mí.

Revise todas las relaciones en la clase que está guardando para trabajar los objetos asociados (y los objetos asociados de los objetos asociados) y asegúrese de que la ID y la VERSIÓN estén configuradas en todos los objetos del árbol de objetos.


Existe otra posibilidad que puede causar este error en hibernación. Puede establecer una referencia no guardada de su objeto A a una entidad adjunta B y desea conservar el objeto C Incluso en este caso, obtendrá el error mencionado anteriormente.


Hay tantas posibilidades de este error, algunas otras posibilidades también están en la página de agregar o editar. En mi caso estaba intentando guardar un objeto AdvanceSalary. El problema es que, en la edición, AdvanceSalary employee.employee_id es nulo. Debido a que en la edición no se estableció el employee.employee_id. He hecho un campo oculto y lo he configurado. mi código funciona absolutamente bien

@Entity(name = "ic_advance_salary") @Table(name = "ic_advance_salary") public class AdvanceSalary extends BaseDO{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "employee_id", nullable = false) private Employee employee; @Column(name = "employee_id", insertable=false, updatable=false) @NotNull(message="Please enter employee Id") private Long employee_id; @Column(name = "advance_date") @DateTimeFormat(pattern = "dd-MMM-yyyy") @NotNull(message="Please enter advance date") private Date advance_date; @Column(name = "amount") @NotNull(message="Please enter Paid Amount") private Double amount; @Column(name = "cheque_date") @DateTimeFormat(pattern = "dd-MMM-yyyy") private Date cheque_date; @Column(name = "cheque_no") private String cheque_no; @Column(name = "remarks") private String remarks; public AdvanceSalary() { } public AdvanceSalary(Integer advance_salary_id) { this.id = advance_salary_id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Employee getEmployee() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } public Long getEmployee_id() { return employee_id; } public void setEmployee_id(Long employee_id) { this.employee_id = employee_id; } }


No uses Cascade.All hasta que realmente tengas que hacerlo. Role y el Permission tienen una relación bidireccional con manyToMany . Entonces el siguiente código funcionaría bien

Permission p = new Permission(); p.setName("help"); Permission p2 = new Permission(); p2.setName("self_info"); p = (Permission)crudRepository.save(p); // returned p has id filled in. p2 = (Permission)crudRepository.save(p2); // so does p2. Role role = new Role(); role.setAvailable(true); role.setDescription("a test role"); role.setRole("admin"); List<Permission> pList = new ArrayList<Permission>(); pList.add(p); pList.add(p2); role.setPermissions(pList); crudRepository.save(role);

mientras que si el objeto es solo uno "nuevo", arrojaría el mismo error.


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

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


Otra posible razón: en mi caso, estaba intentando salvar al niño antes de salvar al padre, en una entidad completamente nueva.

El código era algo como esto en un modelo de User.java:

this.lastName = lastName; this.isAdmin = isAdmin; this.accountStatus = "Active"; this.setNewPassword(password); this.timeJoin = new Date(); create();

El método setNewPassword () crea un registro PasswordHistory y lo agrega a la colección de historial en Usuario. Como la declaración create () aún no se había ejecutado para el padre, estaba intentando guardar en una colección de una entidad que aún no se había creado. Todo lo que tuve que hacer para solucionarlo fue mover la llamada setNewPassword () después de la llamada a create ().

this.lastName = lastName; this.isAdmin = isAdmin; this.accountStatus = "Active"; this.timeJoin = new Date(); create(); this.setNewPassword(password);


Para agregar mis 2 centavos, obtuve este mismo problema cuando accidentalmente envié null como ID. El código a continuación describe mi escenario (y OP no mencionó ningún escenario específico) .

Employee emp = new Employee(); emp.setDept(new Dept(deptId)); // --> when deptId PKID is null, same error will be thrown // calls to other setters... em.persist(emp);

Aquí estoy configurando el ID de departamento existente en una nueva instancia de empleado sin obtener primero la entidad de departamento, ya que no quiero que se active otra consulta de selección.

En algunos casos, el deptId deptId viene como null del método de llamada y obtengo el mismo error.

Por lo tanto, observe null valores null para PK ID


Por el bien de la integridad: A

org.hibernate.TransientPropertyValueException

con mensaje

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

también ocurrirá cuando intente persistir / fusionar una entidad con una referencia a otra entidad que sucede que está desconectada .


Si está utilizando Spring Data JPA, la adición de la anotación @Transactional a su implementación de servicio resolvería el problema.


Si su colección es anulable, pruebe: object.SetYouColection(null);


También me enfrenté a la misma situación. Al establecer la siguiente anotación sobre la propiedad, se resolvió la excepción solicitada.

La excepción que enfrenté.

Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.model.Car_OneToMany

Para superar, la anotación que utilicé.

@OneToMany(cascade = {CascadeType.ALL}) @Column(name = "ListOfCarsDrivenByDriver") private List<Car_OneToMany> listOfCarsBeingDriven = new ArrayList<Car_OneToMany>();

Lo que hizo que Hibernate lanzara la excepción:

Esta excepción se lanza a su consola porque el objeto secundario que adjunto al objeto principal no está presente en la base de datos en ese momento.

Al proporcionar @OneToMany(cascade = {CascadeType.ALL}) , le dice a Hibernate que los guarde en la base de datos mientras guarda el objeto principal.


Una forma simple de resolver este problema es salvar a ambas entidades. Primero guarde la entidad hija y luego guarde la entidad padre. Porque la entidad principal depende de la entidad secundaria para el valor de la clave externa.

Abajo simple examen de una relación uno a uno

insert into Department (name, numOfemp, Depno) values (?, ?, ?) Hibernate: insert into Employee (SSN, dep_Depno, firstName, lastName, middleName, empno) values (?, ?, ?, ?, ?, ?) Session session=sf.openSession(); session.beginTransaction(); session.save(dep); session.save(emp);


Una posible causa del error es la inexistencia de la configuración del valor de la entidad matriz; por ejemplo, para una relación departamento-empleados, debe escribir esto para corregir el error:

Department dept = (Department)session.load(Department.class, dept_code); // dept_code is from the jsp form which you get in the controller with @RequestParam String department employee.setDepartment(dept);


además de todas las otras respuestas correctas, esto podría suceder si usa la merge para persistir un objeto y olvida accidentalmente usar la referencia combinada del objeto en la clase principal. considera el siguiente ejemplo

merge(A); B.setA(A); persist(B);

En este caso, fusiona A pero se olvida de usar el objeto combinado de A para resolver el problema debes reescribir el código de esta manera.

A=merge(A);//difference is here B.setA(A); persist(B);


me sale este error cuando uso

getSession().save(object)

pero funciona sin problemas cuando uso

getSession().saveOrUpdate(object)