Hey guys, I’m having an issue where hibernate is cascading the merge
operation to child entities when I don’t want it to. I have my entities pasted at the bottom of this post.
I’m trying to merge the Munch
entity without merging any Swipes
since they’re handled in a different part of the application. My understanding is that hibernate by default should cascade
none of the DB operations for a @OneToMany
collection or a @ManyToOne
object unless CascadeTypes
are explicitly specified.
Given the entities at the bottom of the post, when I add a Swipe
to munch.swipes
and run the following code, the munch is updated if any of its fields have changed and the added swipe is merged into the db: fun mergeMunch( munch: Munch ) = databaseExecutor.executeAndRollbackOnFailure { entityManager -> entityManager.merge(munch) entityManager.transaction.commit() }
If anyone could shed some light on either what I’m misunderstanding or misconfiguring it would be much appreciated.
The executeAndRollbackOnFailure()
function just in case its useful: fun <T> executeAndRollbackOnFailure( task: (EntityManager) -> T ): T { val em = emf.createEntityManager() return try { em.transaction.begin() task.invoke(em) } catch (e: Exception) { em.transaction.rollback() throw e } finally { em.close() } }
Here are my entities:
Munch
“`
@Entity @TypeDefs( TypeDef( name = “list-array”, typeClass = ListArrayType::class ) ) data class Munch( @Column val name: String, @OneToMany( fetch = FetchType.LAZY, mappedBy = “munch”, ) val swipes: MutableList<Swipe> = mutableListOf(), ) { @Id @GenericGenerator(name = “generator”, strategy = “uuid”) @GeneratedValue(generator = “generator”) lateinit var munchId: String
fun addSwipe(swipe: Swipe) { swipes.add(swipe) swipe.munch = this }
} “`
Swipe
“` @Entity data class Swipe( @EmbeddedId val swipeIdKey: SwipeIdKey, @Column(nullable = true) val liked: Boolean, ) : Serializable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = “munchId”) @MapsId(“munchId”) lateinit var munch: Munch
@Transient var updated = false
“`
SwipeIdKey
“` @Embeddable class SwipeIdKey : Serializable {
@Column(nullable = false) lateinit var restaurantId: String @Column(nullable = true) lateinit var userId: String @Column(nullable = true) var munchId: String? = null
} “`
submitted by /u/Iarduino
[link] [comments]