使用 @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