Пакетное удаление в спящем режиме на таблице «многие ко многим»
1410 просмотра
1 ответ
11368 Репутация автора
еще один много-много вопросов Hibernate. У меня есть простейшее из возможных много-многих сопоставлений:
@Entity
public class Strategy implements Serializable {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_GROUP_ID")})
private Set<StrategyGroup> groups;
...
}
И противоположная сторона отношения выглядит следующим образом:
@Entity
public class StrategyGroup implements Serializable {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_GROUP_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_ID")})
private Set<Strategy> strategies = new HashSet<Strategy>();
То, что я хочу сделать сейчас, это очистить обе таблицы самым простым способом. Я пытаюсь следовать (их мой entityManager).
em.createQuery("delete from StrategyGroup sg").executeUpdate();
em.createQuery("delete from Strategy s").executeUpdate();
Это дает мне нарушение ограничений на @joinTable. С другой стороны, если я удаляю по em.remove(strategyGroup);
ti, все работает нормально - группа стратегий удаляется, а таблица @joinTable корректно обновляется.
Так как мне очистить стол? Нужно ли загружать объекты и удалять их один за другим?
Спасибо за помощь.
Автор: Jan Zyka Источник Размещён: 22.06.2012 09:01Ответы (1)
3 плюса
576333 Репутация автора
Прежде всего, ваше отображение неверно. Одна сторона ассоциации должна быть стороной владельца и определять отображение ассоциации. Другой должен быть на стороне вставки, и просто используйте атрибут mappedBy:
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "groups")
private Set<Strategy> strategies = new HashSet<Strategy>();
Во-вторых, вам действительно следует избегать выборки EAGER для ассоциации toMany, особенно с обеих сторон: это заставит Hibernate рекурсивно загружать все связанные объекты и имеет хорошие шансы загружать все строки обеих таблиц в память каждый раз при загрузке. один ряд
Теперь к вашему вопросу:
Если вы хотите удалить все из обеих таблиц, сначала необходимо убедиться, что таблица соединения пуста, в противном случае на некоторые строки в одной из таблиц все равно будет ссылаться строка таблицы соединения, и это, безусловно, приведет к сбою. Для этого лучше всего использовать SQL-запрос для удаления всего из таблицы соединений перед выполнением двух HQL-запросов, которые у вас уже есть.
Автор: JB Nizet Размещён: 22.06.2012 09:16Вопросы из категории :
- hibernate Как вы «ИЛИ» критерии вместе при использовании запроса критериев с Hibernate?
- hibernate пакет вставки спящего режима с разделенным postgresql
- hibernate Как избежать предупреждений о безопасности типа с результатами Hibernate HQL?
- hibernate Каковы различия между различными методами сохранения в Hibernate?
- hibernate Hibernate: hbm2ddl.auto = обновление в производстве?
- hibernate Hibernate JPA Sequence (без идентификатора)
- hibernate Что такое алгоритм Hi / Lo?
- hibernate Легкая альтернатива Hibernate?
- hibernate проблемы с именем колонки в спящем режиме
- hibernate Grails, вставка большого количества данных с использованием результатов withTransaction в OutOfMemoryError
- many-to-many Вызов функции внутри iframe извне iframe
- many-to-many Само-ссылочные отношения многие-ко-многим в sqlalchemy
- many-to-many JPA Hibernate каскадирование многих ко многим
- many-to-many Entity Framework Code «Сначала многие ко многим» Настройка существующих таблиц
- many-to-many sqlalchemy: keep column values from the association table in a many-to-many relationship
- many-to-many Django удаляет объект из отношений ManyToMany
- many-to-many SQLAlchemy: фильтр по членству хотя бы в одной связанной таблице «многие ко многим»
- many-to-many Сначала создайте код, многие ко многим, с дополнительными полями в таблице ассоциаций.
- many-to-many вставить в много2 многих odoo (бывший openerp)
- many-to-many Эффективное удаление потерянных объектов m2m / tags в Django