powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: удаление с many-to-many
4 сообщений из 4, страница 1 из 1
Hibernate: удаление с many-to-many
    #33766587
kelt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять как правильно удалять класс, который связан с другим соотношением many-to-many (через промежуточную таблицу, которую гибернейт сам генерит на основании мэппинга).

Привожу кусок мэппинга:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  < class  name="Resource" table="T_RESOURCE">
  	<id name="id" type="long" column="resource_id">
  		<generator  class ="sequence">
  			<param name="sequence">resource_id_seq</param>
  		</generator>
  	</id>
  		
	<bag name="listTags" table="T_RESOURCE_TAG" cascade="none">
  		<key column="resource_id" />
  		<many-to-many  class ="Tag" column="tag_id" />
  	</bag>  	
  </ class >

  < class  name="Tag" table="T_TAG">
  	<id name="id" type="long" column="tag_id">
  		<generator  class ="sequence">
  			<param name="sequence">tag_id_seq</param>
  		</generator>
  	</id>  	
  	
  	<bag name="listResources" inverse="true" table="T_RESOURCE_TAG" cascade="none">
  		<key column="tag_id" />
  		<many-to-many  class ="Resource" column="resource_id" />
  	</bag>  	
  </ class >


Удаление делаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Tag tag = getTag(); //здесь допустим получаю реальный persistent объект

Session sess = HibernateUtil.getSession();
Transaction tx = sess.beginTransaction();

sess.delete(tag);

sess.flush();


В момент флаша вылазит JDBC Batch exception, который говорит что у меня Constraint violation (объект в "промежуточной" таблице T_RESOURCE_TAG ссылается внешним ключом на удаляемый Tag). Т.е хибернейт не предпринимает никаких действий чтобы удалить сначала все связи объекта, а потом его самого.

Я конечно сделал несколько телодвижений и смог удалить все эти зависимости обходным путем (res.getListTags().remove(tag) у каждого Resource, с которым связан Tag), но это куча лишних запросов коллекций. Должен быть какой-то _правильный_ способ сделать это.

Подскажите где посмотреть.
...
Рейтинг: 0 / 0
Hibernate: удаление с many-to-many
    #33767195
ddddiiiiimmmmaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ты сам написал, что cascade="none"
...
Рейтинг: 0 / 0
Hibernate: удаление с many-to-many
    #33768977
kelt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ddddiiiiimmmmaaaaНу ты сам написал, что cascade="none"

Cascade каскадирует операцию (т.е повторяет для связанных объектов). В случае cascade="all" при удаление объекта Tag будут удаляться все указывающие на него объекты Resource, а это не есть требуемая логика поведения. Это во-первых.
Во-вторых, cascade="all" я пробовал и все-равно не удаляется ничего.

С другой стороны, каскад тут как бы нужен, но только для удаления объекта из "связной" таблицы T_RESOURCE_TAG, но не из класса "по ту сторону many-to-many".

Есть еще идеи?
Может просто пример рабочий есть у кого?
...
Рейтинг: 0 / 0
Hibernate: удаление с many-to-many
    #33769254
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10.11. Transitive persistence

Recommendations:

* It doesn't usually make sense to enable cascade on a <many-to-one> or <many-to-many> association. Cascade is often useful for <one-to-one> and <one-to-many> associations.
* If the child object's lifespan is bounded by the lifespan of the of the parent object make it a lifecycle object by specifying cascade="all,delete-orphan".
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: удаление с many-to-many
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]