使用guice-persist自动清除会话

时间:2012-02-05 01:46:58

标签: entitymanager guice-servlet guice-persist

我正在使用一个在tomcat上运行guice-servlet的环境,在guice-persist下使用hibernate。我遇到的问题是,当我在一个请求中使用em.getReference()时,加载的代理对象保留在entitymanager缓存中,并且可能出现在我希望从DB完全加载对象的另一个请求中。

我曾经在EJB3环境中使用hibernate,这是一种默认行为。每个新请求都清楚实体管理器缓存。 guice-persist为每个请求清除会话是不是更安全的行为?或者至少将其作为JpaPersistModule的设置?

在休眠SessionImpl“autoClear”中有一个特殊标志,它负责EJB3行为。有什么办法可以在JpaPersistModule创建新的实体管理器时启用该标志吗?

1 个答案:

答案 0 :(得分:4)

解决这个问题:我创建了一个AOP拦截器来捕获JpaPersistService返回的EntityManager。

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

在拦截器内部,我通过EntityManagerImpl获取SessionImpl并设置 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;
}