Hibernate сам-ссылка многие-ко-многим, как удалить без каскада? - PullRequest
1 голос
/ 17 октября 2011

У меня есть отношение «многие ко многим» для одного объекта с самим собой:

    <set name="relatedPersons" lazy="false"  table="PersonRelatedPerson" 
           cascade="none" >
    <key column="personId" foreign-key="fk_related_person" not-
        null="false"/>
       <many-to-many column="relatedPersonId" class="Person" not-found="ignore"/>
    </set>

, как вы можете видеть, я установил каскад «Нет», потому что, когда я удаляю одного человека, конечно, япросто хотел бы удалить отношения из таблицы PersonRelatedPerson, а не связанных с ними людей.Когда я пытаюсь удалить с помощью этого сопоставления, я получаю ConstraintViolationException: не удалось выполнить пакетное обновление JDBC ....

Я предполагаю, что каким-то образом можно удалить это в режиме гибернации, правильно установив некоторые флаги сопоставления(или мне нужно сделать какие-то странные обходные пути, например: сначала удалить второго человека из набора первого человека, удалить первого человека из набора второго, а затем удалить первого .... Я действительно не хочу этого делать: D)

Ценю всю помощь !!!

1 Ответ

4 голосов
/ 17 октября 2011

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

Либо сделайте это с HQL-запросом и удалите A из наборов найденных людей в Java, либо используйте выделенный SQL-запрос на удаление, чтобы удалить все строки из таблицы соединения. Но имейте в виду, что этот SQL-запрос будет обходить кеши (первый уровень и второй уровень, если таковые имеются), и поэтому ваш сеанс может содержать неправильное представление базы данных.

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