Hibernate Удалить, нарушение ребенка - PullRequest
1 голос
/ 27 мая 2019

Я снова застрял при попытке удалить данные с помощью Hibernate ..

Я нахожусь в точке, где я начинаю просто составлять аннотации в стеке, надеясь, что что-то будет работать ... пока ничего не происходит.

Мне нужно удалить старый расчет при запуске нового для того же периода времени.

У меня есть следующий запрос

@Modifying
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "10"))
@Query(value = "DELETE FROM Group a WHERE a.c_date BETWEEN :dateA AND :dateB")
void deleteOld(@Param("dateA") LocalDate dateA, @Param("dateB") LocalDate dateB);

, который использует группу объектов, которая имеет (в верхней части нормальногоАтрибут String, LocalDate и long types)

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
    @JsonManagedReference
    @OnDelete(action = OnDeleteAction.CASCADE)
    private List<Instrument> instruments = new ArrayList<>();

Но я все равно получаю violated - child record found каждый раз, когда пытаюсь запустить метод удаления.

Я продолжаю находить все больше и больше аннотаций, подобных этой, оттемы, где люди имеют такие же проблемы, но я хотел бы понять, почему это проблема.Из того, что я прочитал, Cascade и orphanRemoval должны быть все, что мне нужно, но это точно не похоже.

Hibernate: 5.2.17.Final

Пожалуйста, помогите мне понять, почему этопроисходит?

1 Ответ

2 голосов
/ 27 мая 2019

@OnDelete удалит записи, используя правило ON DELETE в базе данных, при использовании Hibernate для генерации схемы. Если вы управляете своей собственной схемой, это не будет иметь никакого эффекта.

Указанное вами @QueryHints на самом деле не имеет смысла для запроса DELETE. Ничего не будет доставлено.

Тот факт, что вы используете @Query, в основном обходит конфигурацию в @OneToMany, просто из-за того, что вы пишете запрос и, очевидно, знаете, что делаете. Таким образом, отображение не принимается во внимание.

Если вы хотите удалить childs, то у вас есть 3 варианта:

  1. Добавьте дополнительный запрос и сначала удалите потомков, затем родителей
  2. Добавьте правило ON DELETE в вашу базу данных, чтобы автоматически удалить дочерние элементы
  3. Извлеките Group и удалите, используя EntityManager.remove, который примет во внимание сопоставления @OneToMany, поскольку теперь Hibernate должен управлять зависимостями между сущностями.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...