使用 @PersistenceContext(type=PersistenceContextType.EXTENDED) 时避免 1 级缓存问题

Posted

技术标签:

【中文标题】使用 @PersistenceContext(type=PersistenceContextType.EXTENDED) 时避免 1 级缓存问题【英文标题】:Avoid 1 level cache issues while using @PersistenceContext(type=PersistenceContextType.EXTENDED) 【发布时间】:2011-05-01 01:32:07 【问题描述】:

我刚刚在我的 DAO 类上配置了 @PersistenceContext(type=PersistenceContextType.EXTENDED) 以在视图层上进行延迟加载(需要让它不为此关闭会话),但我遇到了 1 级缓存问题(我想)..因为即使我的二级缓存设置关闭,对象也会被缓存。关闭“type=PersistenceContextType.EXTENDED”后,系统没有缓存对象,而是再次陷入延迟加载问题。

//@PersistenceContext(type=PersistenceContextType.EXTENDED) @PersistenceContext 私有EntityManager entityManager;

有什么办法可以控制吗?我真的需要延迟加载,但不想每次都将我的对象存储在 1 级缓存中。

谢谢

【问题讨论】:

抱歉:我使用的是休眠 jpa impl 【参考方案1】:

除非您真的想使用扩展的持久性上下文并真正理解它的含义(我并不是要迂腐,但这很重要,因为扩展的实体管理器具有不同的线程、生命周期和内存管理语义),我的建议是使用通常的 OEIV (Open EntityManager in View) 模式 来解决您的延迟加载问题。

Spring 提供了这个模式的两个实现,一个过滤器(OpenEntityManagerInViewFilter)和一个拦截器(OpenEntityManagerInViewInterceptor)。来自 javadoc:

适用于“在视图中打开 EntityManager”模式,即允许在 Web 视图中延迟加载,尽管原始事务已经完成。

【讨论】:

嗯,它会让我的持久性与请求创建的线程一起存活,不知道它是否会给我带来问题,但可能比 PersistenceContextType.EXTENDED 更好。谢谢

以上是关于使用 @PersistenceContext(type=PersistenceContextType.EXTENDED) 时避免 1 级缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中的 PersistenceContext 生命周期

EntityManager bean 的 @Autowired 与 @PersistenceContext

为啥我们必须在扩展的 PersistenceContext 中手动 flush() EntityManager?

PersistenceUnit vs PersistenceContext

未注入 OSGI 服务 JPA PersistenceContext

如何在单元测试期间注入 PersistenceContext?