在检索一对多关系实体时使用JCS Cache获取延迟初始化异常

时间:2013-11-13 10:19:23

标签: jpa jcs

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我不熟悉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层,或以某种方式拦截服务层的缓存加载事件并重新附加分离的对象。