У меня есть пара объектов 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 3.2.6.