我有一组非常繁重的查询,其结果我想缓存到外部缓存实现中(缓存整个对象列表不仅仅是像Hibernate的二级缓存中的ID)。
问题是由于根对象中延迟加载了几个集合,一旦查询结果的会话完成,对象就会被取消附加,下一个尝试使用该对象的请求可能会抛出一个LazyLoading异常。
环境:Spring 4,Hibernate 4.3,Ehcache。
有没有办法能够将对象重新附加到新会话而不修改底层数据库(如合并和更新)?
答案 0 :(得分:1)
为了加载延迟初始化的集合,无法将分离的实体重新附加到会话。
为了在不覆盖会话/调用合并的情况下获取持久对象的更新副本,需要调用either EntityManager.find()
或进行查询。
这是因为会话的主要目标是使数据库和内存中的对象保持同步。因此,没有用于附加新状态而不持久化的API,因为这与会话的主要功能不一致。
如果与查询缓存一起配置,则第二级缓存可以以比任何自定义解决方案更好的方式解决缓存实体,查询及其关联的问题。
所有内容都可以缓存到没有查询到达数据库的程度。这两个缓存真的在一起,请查看blog post以获取更多信息。