Вопрос:

Пакетное удаление в спящем режиме на таблице «многие ко многим»

hibernate many-to-many

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
Вопросы из категории :
32x32