У меня есть три спящих объекта:
Song представляет файл песни (например, файл mp3),
CoverArt содержит песни coverart, песня может иметь несколько частей coverart
Внутри Песня Я определяю ссылку на CoverArt как:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;
В пределах CoverArt ссылка на Song не определена, у нас просто есть
@Id
@GeneratedValue
private Integer id;
Приложение работает нормально, кроме случаев, когда я хочу очистить сущности Song и CoverArt.
Это не происходит последовательно, но если я попытаюсь удалить из Song first
e.g
String hql = String.format("delete from CoverArt");
Query query = session.createQuery(hql);
query.executeUpdate();
hql = String.format("delete from Song");
query = session.createQuery(hql);
query.executeUpdate();
session.getTransaction().commit();
Я получаю исключение:
Вызывается: org.h2.jdbc.JdbcSQLException: ссылочная целостность
нарушение ограничения: "FK_CBUK1UQ1D0DQAA077XH16SRX2:
PUBLIC.SONG_COVERART FOREIGN KEY (COVERARTS_ID) ССЫЛКИ
PUBLIC.COVERART (ID) (13) "; оператор SQL:
и если я попробую другой путь
String hql = String.format("delete from Song");
Query query = session.createQuery(hql);
query.executeUpdate();
hql = String.format("delete from CoverArt");
query = session.createQuery(hql);
query.executeUpdate();
Я получаю исключение
Вызывается: org.h2.jdbc.JdbcSQLException: ссылочная целостность
нарушение ограничения: "FK_4B4O39V3RSF1IWWRIX6QQQTLK:
PUBLIC.SONG_COVERART FOREIGN KEY (SONG_RECNO) ССЫЛКИ
PUBLIC.SONG (RECNO) (1) "; оператор SQL:
Таким образом, невозможно очистить таблицы, CoverArt сущность существует только как часть песни, поэтому я предположил, что это будет только внешний ключ из таблицы COVER_ART в таблицу SONG, и ожидал, что я могу удалить все из CoverArt без проблем, но существует временная таблица SONG_COVERART, в которой есть внешние ключи для обеих таблиц, предотвращающие удаление.
Что я делаю не так (использую Hibernate 4.3.11)