[hibernate-dev] HHH-11144

Gail Badner gbadner at redhat.com
Mon Jan 23 06:17:40 EST 2017


This fell through the cracks.

Emmanuel or Steve, please provide some feedback.

Thanks,
Gail

On Wed, Oct 26, 2016 at 6:48 AM, Gail Badner <gbadner at redhat.com> wrote:

> 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
>


More information about the hibernate-dev mailing list