0

我们正在使用 JCS 缓存并成功放置实体。当我们从 JCS 缓存中检索数据时,我们能够检索实体,但如果它具有一对多的关系实体,则无法检索相关实体。我们得到了惰性初始化扩展。请建议我们。

4

2 回答 2

0

在将数据放入 JCS 缓存之前,检索相关实体。

于 2013-11-13T10:20:32.163 回答
0

对实体使用非 ORM 缓存机制需要小心,因为它很容易导致此类问题。本质上,您需要确定添加到缓存中的任何对象都已初始化到某个其他进程从缓存中检索它所需的程度。

我不熟悉但 JCSCache 但以 Spring 的缓存抽象为例:

private CustomerService{
    @Cacheable
    public Customer loadCustomer(long id){

    /*if cache contains item with Key id this
     *is not called and therefore no session is 
     *open when the view is rendered.
     */
    customerDao.findById(id);  
    }
}

例如,假设您有一个拥有一系列订单的客户。

你有一个过程:

  • 显示客户摘要屏幕(姓名、地址等)。
  • 通过某种机制检索客户实体并将其添加到(非 JPA)缓存中。
  • 由于摘要屏幕未触及订单集合未初始化(假设延迟映射)

你有过程2:

  • 显示客户订单历史
  • 您调用与上面 [1] 中相同的方法来检索客户
  • 您正在使用 OSIV 模式,因此没有缓存会话保持打开状态并按需获取订单。
  • 然而,通过缓存,缓存管理器检测到该实体被缓存并返回在进程 [1] 中创建的部分初始化的缓存实例。
  • 当您尝试访问缓存的惰性订单关联时,不会打开任何会话并且会发生异常。

因此,要么您需要确保缓存实例完全初始化,将缓存转移到将重新打开会话的 DAO 层,要么以某种方式在服务层拦截缓存加载事件并重新附加分离的对象。

于 2013-11-13T11:35:32.870 回答