HHH-11144 involves an entity that has 2 one-to-many associations with the same type of entity, and both associations have orphanRemoval = true. Andrea created a PR with test case at [1]
I am not sure if this is a valid mapping. I I would like your thoughts on this. Here is an excerpt of the relevant bits: @Entity(name = "Item") public static class Item { @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) protected Set<ItemRelation> lowerItemRelations = new LinkedHashSet<>(); @OneToMany(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true) protected Set<ItemRelation> higherItemRelations = new LinkedHashSet<>(); } @Entity(name = "ItemRelation") public static class ItemRelation { @ManyToOne(optional = false) @JoinColumn(name = "PARENT_ID") private Item parent; @ManyToOne(optional = false) @JoinColumn(name = "CHILD_ID") private Item child; } HHH-11144 describes inconsistent behavior observed when Item#lowerItemRelations and Item#higherItemRelations both contain the same ItemRelation, then one of the collections is cleared. If the non-cleared collection is uninitialized, then the ItemRelation is orphan deleted. If the non-cleared collection is initialized, then the orphan-deleted ItemRelation is rescued when PERSIST_ON_FLUSH cascades to the non-cleared collection elements. The next time the collections are loaded from the database, both will still contain that same ItemRelation. The spec says: "Portable applications must otherwise not depend upon a specific order of removal, and must not reassign an entity that has been orphaned to another relationship or *otherwise attempt to persist it*" Is Hibernate doing the right thing by rescuing an orphan-deleted entity? In addition, this mapping allows a particular EntityRelation to be associated with 2 different Item entities, which would mean that the same ItemRelation would have 2 different owners with respect to orphan deletion.. The spec says: "The orphanRemoval functionality is intended for entities that are privately “owned” by their parent entity." Does this mean that the mapping is invalid, since it would allow multiple parent entities, or does it mean that the resulting behavior is undefined (thus non-portable)? Please let me know your thoughts. Thanks, Gail [1] https://github.com/hibernate/hibernate-orm/pull/1607 _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev