Hibernate L2 Кэширование и отношения многие ко многим - PullRequest
3 голосов
/ 13 мая 2009

У меня есть пара сущностей Hibernate, A и B, которые связаны через двунаправленное отношение «многие ко многим», как описано здесь - то есть каждая сущность имеет мешок, ссылающийся на коллекцию объекта другого типа, с таблицей ссылок, содержащей первичный ключ каждого объекта.

Я также использую кэширование Hibernate L2 для кэширования значений коллекции, например:

<bag name="xyz" table="XYZ" ...>
    <cache usage="nonstrict-read-write"/>
</bag>

Проблема, с которой я сталкиваюсь, заключается в том, что при обновлении отношения с одной стороны кэшированная коллекция элементов с другой стороны не обновляется.

Например:

A a = session.get(1L, A.class);

B b = a.getBs().get(0);
Long bId = b.getId();

a.getBs().remove(0) // delete the B from A
// ... flush and commit the transaction...

B b2 = session.get(bId, B.class);
Collection<A> as = b2.getAs();

Коллекция as по-прежнему содержит ссылку на a, хотя состояние базы данных отражает тот факт, что связь была удалена. После аннулирования кэша Hibernate вернет правильные результаты.

Есть ли в hibernate какие-либо механизмы для обработки аннулирования кэша связанных сущностей, или мне нужно удалить связь с обоих концов?

Я использую Hibernate 3.2.6.

1 Ответ

1 голос
/ 31 мая 2009

По определению нужно убрать с обеих сторон. Это имеет смысл от техническая перспектива, так как в основном обе коллекции кэшируются независимо друг от друга.

Конечно, это чепуха с практической точки зрения и многие люди споткнуться об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...