Почему JPA вызывает обновление sql при удалении? - PullRequest
1 голос
/ 05 ноября 2019

Давайте предположим, что эти две сущности:

@Entity
public class MyEntity {
    @Id private String id;
    @OneToMany(mappedBy = "myEntity", cascade = ALL) private Set<MyEntityPredecessor> predecessors;
}

@Entity
public class MyEntityPredecessor{
    @Id private String id;
    @ManyToOne(name = "entityID", nullable = false) private MyEntity myEntity;
    @ManyToOne(name = "entityPre", nullable = false) private MyEntity predecessor;
}

Когда я пытаюсь вызвать удаление с помощью Spring Boot Data (JPA) с экземпляром MyEntity, оно будет работать несколько раз (я вижу select изатем операторы удаления в правильном порядке), но иногда он пытается запустить обновление для второй сущности, пытаясь установить для поля «entityPre» значение null (даже если оно установлено в nullable = falsE), в результате чего БД отправляетошибка (ноль не допускается !! из ограничения БД).

Странно, это будет происходить при "случайных" вызовах удаления ...

Я просто вызываю "myEntityRepository.getOne (id)", а затем myEntityRepository.delete () с результатом... В базе данных нет разницы между вызовами, структура данных не имеет нулевых значений при вызове метода удаления, поэтому это не должно быть причиной.

Почему JPA иногда пытается вызвать обновления в Таблице предшественников, а иногда напрямую удаляет значения? Я что-то упустил?

1 Ответ

0 голосов
/ 05 ноября 2019

Добавьте аналогичный ManyToOne аннотированный набор к MyEntity, который ссылается на другое необнуляемое свойство, например:

@OneToMany(mappedBy = "predecessor", cascade = ALL) private Set<MyEntityPredecessor> other;

некоторые объяснения: проблема не возникает случайно,но происходит, когда вы пытаетесь удалить объект, который связан с одним (или более) MyEntityPredecessor через свойство predecessor (которое сопоставлено с полем entityPre)

Только другое поле (entityID) сопоставляется обратно с объектом MyEntity, поэтому каскад удаления происходит только через это поле.

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