Почему Hibernate создал таблицу соединений, которая не позволяет мне очищать содержимое таблицы - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть три спящих объекта:

  • CoverArt
  • Песня

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)

1 Ответ

1 голос
/ 01 апреля 2019

Возможно, потому что в предыдущей версии вашего кода не было аннотации JoinColumn, и, таким образом, Hibernate создал таблицу соединений для этой ассоциации, которую вы заполнили, но забыли удалить.

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