spring-boothibernate

Spring Boot Hibernate 6.6.0 delete TransientObjectException after update


After updating hibernate to 6.6.5.Final from 6.5.3.Final with Spring Boot Starter Parent 3.4.2 i get following exception.

org.hibernate.TransientObjectException: persistent instance references an unsaved transient instance of 'entity.Basket' (save the transient instance before flushing)
    at org.hibernate.engine.spi.CascadingActions$9.cascade(CascadingActions.java:382)
    at org.hibernate.engine.spi.CascadingActions$9.cascade(CascadingActions.java:372)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:570)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:492)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:253)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:192)
    at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:169)

Where Basket has a User and multiple goods. Here is an abstract implementation:

@Entity
data class Basket (
    @OneToOne
    var user: User? = null,

    @ManyToOne
    var goods: Goods? = null,
    ...
)

@Entity
data class User (
   @OneToOne(mappedBy = USER, cascade = [CascadeType.REMOVE])
   var basket: Basket? = null,
   ...
)

@Entity
data class Goods (
   @OneToMany(mappedBy = "Goods", cascade = [CascadeType.ALL])
   var basket: MutableList<Basket> = mutableListOf(),
   ...
)
basketRepository.deleteById(id)

See also this hibernate thread https://discourse.hibernate.org/t/instance-save-transient-before/10293

So i tried to set CascadeType to PERSIST and MERGE. Use the entityManager merge() function and set User/Basket to null.


Solution

  • Resolved by removing the Basket relation in User and Goods entity. When deleting the entity is detach.