3

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

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

hibernate SessionImpl "autoClear" 中有一个特殊的标志,它负责 EJB3 行为。当 JpaPersistModule 创建新的实体管理器时,有什么方法可以启用该标志?

4

1 回答 1

3

以这种方式解决它:我创建了一个 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;
}
于 2012-02-05T21:06:15.160 回答