【问题标题】:Auto-cleared sessions with guice-persist使用 guice-persist 自动清除会话
【发布时间】:2012-02-05 01:46:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: entitymanager guice-servlet guice-persist


    【解决方案1】:

    这样解决:我创建了一个 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;
    }
    

    【讨论】:

    • 请注意,您也可以致电castedEm.clear() 获得相同的效果 - 解决了过时数据的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2011-07-02
    • 2012-06-29
    • 2014-04-05
    • 2014-12-26
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多