Каскадное удаление объекта с помощью @ElementCollection - PullRequest
0 голосов
/ 17 октября 2019

У меня есть проблема при каскадном удалении моего родительского объекта:

org.postgresql.util.PSQLException: UPDATE или DELETE для таблицы "child" нарушает ограничение "XXX": для ключа (id) = (4) в таблице "child_properties" есть ссылки

@Entity
@Table(name = "Parent")
public class Parent{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.EAGER,mappedBy = "parent")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Set<Child> children;
}

@Entity
@Table(name = "child")
public class Child{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @ElementCollection(fetch = FetchType.EAGER)
    private Map<String,String> properties;
}

Я ожидал, что child удалит свои свойства в parentRepository.delete (parent), но это происходит только в childRepository.delete (child). исключение родительского удаления создает исключение

1 Ответ

0 голосов
/ 17 октября 2019

решение было ~ 3 часа поиска в Google ... идея состоит в том, чтобы установить пользовательский внешний ключ

@ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "child_properties"
        ,joinColumns = {
            @JoinColumn(name = "child_id"
                , referencedColumnName = "id"
                ,foreignKey=@ForeignKey(name="CHILD_PROPERTY_FK"
                    , foreignKeyDefinition = "FOREIGN KEY (child_id) references public.child (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE"))
        }
    )
    @MapKeyColumn(name = "name")
    @Column(name = "value")
    private Map<String,String> properties;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...