gpt4 book ai didi

entitymanager - 使用 guice-persist 自动清除 session

转载 作者:行者123 更新时间:2023-12-04 06:17:46 37 4
gpt4 key购买 nike

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

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

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

最佳答案

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

关于entitymanager - 使用 guice-persist 自动清除 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146239/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com