Я заметил, что Hibernate ведет себя неоптимально с отношениями ManyToMany ... Это вызывает проблемы, потому что моя таблица отношений также имеет последние обновленные метки времени (поддерживаются MySQL автоматически), но Hibernate слишком много удаляет / вставляет, прикручиваю мои метки времени.
Моя настройка:
- Отношение многих ко многим между A и B
- База данных содержит A (id = 1), относящийся к 10 B (идентификаторы от 1 до 10)
Когда я удаляю одну связь между A (id = 1) и говорю B (id = 10), Hibernate делает следующее:
- Удалить все отношения между A (id = 1) и B
- Вставить отношения от A (id = 1) до B (идентификаторы от 1 до 9)
Вместо этого я бы хотел:
- Просто удалите отношения между A (id = 1) и B (id = 10)
Можно ли это сделать с помощью Hibernate ??
Вот сущности:
@Entity
public class A {
@Id @GeneratedValue
private int id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name="a_b_ref")
private List<B> b;
...
}
@Entity
public class B {
@Id @GeneratedValue
private int id;
@ManyToMany(fetch = FetchType.LAZY, mappedBy="b")
private List<A> a;
...
}
И тестовый код:
@PersistenceContext
EntityManager em;
@Test
@Transactional
public void test1() {
A a = new A();
a.setB(new ArrayList<B>());
for (int i = 0; i < 10; i++) {
B b = new B();
em.persist(b);
a.getB().add(b);
}
em.persist(a);
em.flush();
a.getB().remove(9);
em.flush();
}
Последний сбрасывает этот SQL:
delete from a_b_ref where a_id=?
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
insert into a_b_ref (a_id, b_id) values (?, ?)
Тогда как я хочу:
delete from a_b_ref where a_id=? and b_id=?