Hibernate L2-кэширование и отношения «многие ко многим»

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


person Andrew Newdigate    schedule 13.05.2009    source источник


Ответы (1)


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

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

person Mainguy    schedule 31.05.2009