Автоматически очищенные сессии с guice-persist - PullRequest
4 голосов
/ 05 февраля 2012

Я использую среду с guice-сервлетом, работающим на tomcat и в спящем режиме под guice-persist.Проблема, с которой я столкнулся, заключается в том, что когда я использую em.getReference () в одном запросе, загруженный прокси-объект остается в кэше управления данными и может появиться в другом запросе, где я ожидаю, что объект полностью загружен из БД.

Раньше я использовал hibernate в среде EJB3, где это поведение по умолчанию.Кэш менеджера сущностей очищается для каждого нового запроса.Разве не безопаснее поведение guice-persist для очистки сеанса для каждого запроса?Или, по крайней мере, указать его в качестве параметра для JpaPersistModule?

В hibernate SessionImpl "autoClear" есть специальный флаг, который отвечает за поведение EJB3.Можно ли как-нибудь включить флаг, когда JpaPersistModule создает новый менеджер сущностей?

1 Ответ

4 голосов
/ 06 февраля 2012

Решил это следующим образом: я создал перехватчик AOP для перехвата EntityManager, возвращаемого JpaPersistService.

bindInterceptor(Matchers.subclassesOf(PersistService.class),
        Matchers.returns(Matchers.identicalTo(EntityManager.class)),
        new EntityManagerInterceptor()
);

Внутри перехватчика я получаю SessionImpl через EntityManagerImpl и устанавливаю autoClear собственность.

public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    if (result instanceof EntityManagerImpl) {
        EntityManagerImpl castedEm = (EntityManagerImpl) result;
        ((SessionImpl) castedEm.getSession()).setAutoClear(true);
    }
    return result;
}
...