Дважды проверьте, поддерживаете ли вы двустороннюю связь. То есть; убедитесь, что все PromoProgramParam
сущности, которые ссылаются на PromoProgram
в качестве его родителя, также содержатся в списке params
указанного родителя. Это хорошая идея, чтобы убедиться, что это происходит независимо от того, какая сторона «инициирует» ассоциацию, если хотите; если setPromoProgram вызывается для PromoProgramParam, то установщик автоматически добавит себя в список params
PromoProgram. И наоборот, при вызове addPromoProgramParam для PromoProgram установите его в качестве родителя параметра.
Я также сталкивался с этой проблемой и раньше, и это происходило из-за несоблюдения двунаправленной согласованности. Я отладил в Hibernate и обнаружил, что он не мог каскадировать операцию удаления для детей, потому что их не было в списке. Однако они наверняка присутствовали в базе данных и вызывали исключения FK, поскольку Hibernate пытался удалить только родителя, не удаляя сначала его дочерних элементов (что вы, вероятно, также встречали с @NonNull на месте).
К вашему сведению, я полагаю, что «EJB 3.0» для создания поля PromoProgramParam.promoProgram (скажем, 100 раз), не допускающего обнуления, это установить необязательный атрибут = false в аннотации @ManyToOne.