Hibernate @ManyToMany удаляет / повторно добавляет все отношения, когда изменяется только одна - PullRequest
1 голос
/ 09 января 2012

Я заметил, что 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=?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...