нарушение целостности (…) нарушено - найдена дочерняя запись, Java, Oracle, Hibernate

1

Мне не нужно обновлять значения при обновлении Crypto, но удалять все дочерние значения при удалении Crypto:

class Crypto {
...
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="cryptoId", updatable=false)
    private Set<Values> values;
...
}


class Values {
...
    @ManyToOne
    @JoinColumn(name = "cryptoId")
    private Crypto crypto;
...
}

Отладчик SQL при удалении Crypto:

Hibernate: удалить из "Crypto", где "id" =?

Ошибка:

java.sql.SQLIntegrityConstraintViolationException: ORA-02292: ограничение целостности (ARTIKUA.FK_8R5C0WLWJ3JIJTVJ559EV8NAT) нарушено - найдена детская запись

DB - это Oracle Why Hibernate, прежде чем удалить "Crypto", не удалять все их дочерние значения "Значения"?

  • 0
    Как вы удаляете экземпляр объекта Crypto? через HQL?
  • 0
    session = sf.openSession (); session.delete (); session.close ();
Показать ещё 2 комментария
Теги:
hibernate

1 ответ

1

Если вы удаляете объект Crypto через hql, спящий режим не может каскадировать операцию удаления. Поскольку каскад - это вопрос конфигурации спящего режима (т.е. Hbm.xml или аннотации), данные должны быть возвращены в Java для обработки каскадов. Выполнение модификаций строк UPDATE/DELETE в HQL происходит исключительно на сервере базы данных.

Что ты можешь сделать:

  1. выберите все экземпляры Crypto, которые необходимо удалить. для каждого из них.
  2. Вызовите entityManager.remove() или session.delete().
  • 0
    Я использую session.delete (), но почему мне нужно получить все элементы? Там нужно только то , что Hibernate сделать что - то вроде "DELETE FROM Values WHERE cryptoId =" + Crypto.getId (), прежде, чем удалить Crypto
  • 0
    Это был бы запрос HQL. Я не полностью следовал. Вы используете session.delete () или hql запрос? Разместите свой полный код в своем вопросе
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню