Я начну с того, что очень плохая идея, что сущность - это та, которая использует менеджера сущностей напрямую.
Метод EntityManager.merge () возвращает фактический объединенный экземпляр, это подразумевает, что в вашем коде при выдаче
em.merge(this)
У вас нет никаких гарантий того, что объединенный экземпляр больше соответствует «этому», и с этого момента вы можете увидеть все виды логических проблем.
Если вы не думаете, что это настолько важно, ваша проблема должна быть решена путем включения удаления сирот на стороне OneToMany отношений, при условии, что дети не используются где-либо еще в других отношениях. В противном случае вам придется выполнить объединение вручную.
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
Set<Child> childrens = new HashSet<Child>();
В спецификации JPA 2.0 указано, что
Ассоциации, указанные как OneToOne или OneToMany, поддерживают использование orphanRemoval.
вариант. Следующие поведения применяются, когда действует orphanRemoval:
- Если объект, который является целью
отношения удалены из
отношения (установив
отношение к нулю или удаление
сущность из отношений
сбор), операция удаления
будет применяться к сущности
осиротел. Операция удаления
применяется во время сброса
операция. СиротаУдалить
Функциональность предназначена для
юридические лица, которые находятся в частной собственности
их родительской сущностью. портативный
в противном случае приложения не должны
зависит от определенного порядка
удаление, и не должны переназначать
субъект, который был осиротел
другие отношения или иным образом
попытка упорствовать. Если субъект
быть осиротевшим отстраненным, новым или
удаленная сущность, семантика
orphanRemoval не применяются.
- Если операция удаления применяется к
управляемый исходный объект, удаление
операция будет каскадно
целевые отношения в соответствии
с правилами раздела 3.2.3, (и
следовательно, не нужно указывать
каскад = УДАЛИТЬ для
отношения) [20]. * * +1018