In my domain model, a membership belongs to a restaurant (eager), and a restaurant has many locations (lazy).
// Membership.kt
@ManyToOne
@JoinColumn(name = "restaurantId", referencedColumnName = "restaurantId", insertable = false, updatable = false)
lateinit var restaurant: Restaurant
// Restaurant.kt
@OneToMany
@JoinColumn(name = "restaurantId", referencedColumnName = "restaurantId", insertable = false, updatable = false)
var locations: MutableSet<Location> = mutableSetOf()
I have an entity graph in Membership.kt
specifying that I want to load membership.restaurant.locations
:
@NamedEntityGraph(
name = "Membership.WithLocations",
attributeNodes = [
NamedAttributeNode("restaurant", subgraph = "Restaurant.WithLocations")
],
subgraphs = [
NamedSubgraph(
name = "Restaurant.WithLocations",
attributeNodes = [
NamedAttributeNode("locations")
]
)
]
)
In my service layer, I want a method that saves a membership and returns it with this entity graph applied. Here’s what I tried:
@Transactional
fun saveAndRefresh(membership: Membership, entityGraphName: String): Membership {
membershipRepository.save(membership)
val newMembership = entityManager.find(Membership::class.java, membership.id)
entityManager.refresh(
newMembership,
mapOf("javax.persistence.fetchgraph" to entityManager.getEntityGraph(entityGraphName))
)
return newMembership
}
But I find that membership.restaurant.locations
still has not been initialized. Why not?
I have tried using entityManager.flush()
after the save, and also fully detaching the membership after saving with entityManager.detach(membership)
, but neither helps.