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

Jpa 检索一对多关系实体时使用JCS缓存获取延迟初始化异常,jpa,jcs,Jpa,Jcs,我们正在使用JCS缓存并成功放置实体。当我们从JCS缓存中检索数据时,我们能够检索实体,但如果它具有一对多关系实体,则无法检索相关实体。我们正在得到延迟初始化表达式。请建议我们。在将数据放入JCS缓存之前,请检索相关实体。对实体使用非ORM缓存机制需要小心,因为这很容易导致此类问题。本质上,您需要确保添加到缓存中的任何对象都已初始化到其他进程从缓存中检索它所需的程度 我不熟悉JCSCache,但以Spring的缓存抽象为例: private CustomerService{ @Cache

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

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

对实体使用非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]中创建的部分初始化的缓存实例
  • 从未打开任何会话,并且在尝试访问缓存的lazy orders关联时将发生异常
因此,您需要确保缓存实例已完全初始化,将缓存转移到DAO层,在DAO层中重新打开会话,或者以某种方式在服务层拦截缓存加载事件并重新连接分离的对象