Как я могу каскадно удалить коллекцию, которая является частью сущности jpa? - PullRequest
16 голосов
/ 08 октября 2011
@Entity
public class Report extends Model {

    public Date date;
    public double availability;

    @ElementCollection
    @Cascade(value={CascadeType.ALL})
    public Map<FaultCategory, Integer> categories;      
}

На одном из моих рабочих мест у меня есть следующий код:

int n = MonthlyReport.delete("date = ?", date);

Всегда не удается удалить объект со следующей ошибкой:

Оператор DELETE конфликтует с ограничением REFERENCE "FK966F0D9A66DB1E54". Конфликт произошел в базе данных «TFADB», таблице «dbo.MonthlyReport_categories», столбце «MonthlyReport_id».

Как указать отображение, чтобы элементы из коллекции категорий удалялись при удалении отчета?

Ответы [ 2 ]

27 голосов
/ 08 октября 2011

Каскадное удаление (и каскадные операции в целом) действует только тогда, когда операция выполняется через EntityManager. Не тогда, когда удаление выполняется как массовое удаление по запросу JP QL / HQL. Вы не можете указать отображение, которое бы связывало удаление с элементами в ElementCollection, когда удаление выполняется с помощью запроса.

ElementCollection аннотация не имеет каскадного атрибута, потому что операции всегда каскадные. Когда вы удаляете свою сущность через EntityManager.remove(), операция каскадно переходит в ElementCollection.

Вы должны выбрать все MonthlyReport сущностей, которые хотите удалить, и вызвать EntityManager.remove для каждой из них. Похоже, вместо этого в Play Framework вы также можете вызывать delete-метод в сущности.

0 голосов
/ 05 октября 2018

Мы нашли волшебный билет!Добавьте OnDelete (action = OnDeleteAction.CASCADE) к ElementCollection.Это позволяет нам удалить элемент из SQL (за пределами entityManager).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...