了解JPA 2.0 Cache的更新方式

时间:2014-07-17 20:08:47

标签: database caching jpa

我有一个JPA实体,其定义如下。它标记为只读,缓存设置为凌晨3点到期。

请考虑这种情况。 1.该表有一个deptId:100和部门名称:“SALES”

的记录
  1. 使用

    以编程方式获取记录
    entityManager.createNamedQuery("Department.findById").setParameter("depId",100)           .getResultList();
    
  2. 返回的记录包含部门名称“SALES”

    1. 使用更新直接在后端数据库中修改上述记录数据 sqlquery的。将部门名称从“SALES”更改为“REGIONAL_SALES”

    2. 使用entityManager.createNamedQuery("Department.findById").setParameter("depId",100) .getResultList();

    3. 以编程方式使用deptId:100获取记录
    4. 返回的记录包含更新的部门名称

    5. JPA如何知道后端的值已更新?而不是从缓存中获取它从DB

      获取更新的值

      数据库更改后是否更新了缓存。我已将缓存设置为仅在凌晨3点(格式为24小时)到期

      请帮助我理解

      @NamedQuery(name="Department.findById", query = "SELECT d from Department d WHERE d.deptNo= :depId")
      @Entity
      @Table(name="DEPARTMENT")
      @Cache(expiryTimeOfDay=@TimeOfDay(hour=3))
      @ReadOnly
      
      public class Department{
      @EmbeddedId 
      int deptNo;
      
      @Column
      String deptName;
      
      //constructor, getter and setter
      
      }
      

2 个答案:

答案 0 :(得分:0)

查询将转到数据库(禁止任何特定于实现的选项以仅使用缓存)。这不是实现“知道”数据存储区已更新的情况......无论如何它都会去那里。但EM.find()电话不一样。

答案 1 :(得分:0)

JPA提供商有不同的缓存策略。您没有说明您使用的提供程序,但我假设您使用的是EclipseLink。从他们的维基引用:

  

默认情况下,EclipseLink中的所有查询都访问数据库,除非它们是Id或缓存索引字段。

我建议你检查

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache http://www.eclipse.org/eclipselink/documentation/2.6/concepts/cache003.htm

从我的角度来看,你的查询应首先点击缓存。 虽然您注释了@EmbeddedIdint类型的字段,但它很奇怪。 它是否适合您,因为它会导致以下异常?

  

Entity类(...)嵌入了   [class int]类型的tribute [id]不是Embeddable类。可能的原因:如果元数据完成

,则在orm.xml中缺少@Embeddable或缺少