使用 guice-persist 自动清除会话

发布于 2025-01-02 08:31:30 字数 391 浏览 0 评论 0原文

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

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

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

I'm using an environment with guice-servlet running on a tomcat and hibernate under guice-persist. The problem I've encountered is that when I use em.getReference() in one request the loaded proxy object stays in the entitymanager cache and may appear in another request where I expect to have an object completely loaded from the DB.

I used to using hibernate in EJB3 environment where it is a default behavior. The entity manager cache is clear for each new request. Isn't it a more safe behavior for guice-persist to clear the session for each request? Or at least to give it as a setting for JpaPersistModule?

There is a special flag in hibernate SessionImpl "autoClear" which is responsible for EJB3 behavior. Is there any way I could enable the flag when the new entity manager is being created by JpaPersistModule?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

同尘 2025-01-09 08:31:30

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

Solved it this way: I've created an AOP interceptor to catch EntityManager returned by JpaPersistService.

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

Inside an interceptor I'm getting SessionImpl through EntityManagerImpl and setting autoClear property.

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文