JPA2和EclipseLink-尝试理解缓存

JPA2和EclipseLink-尝试理解缓存,jpa,eclipselink,Jpa,Eclipselink,我想了解JPA2中使用EclipseLink作为持久性提供者的缓存。我不知道我的想法是否正确 例如: 我使用JTA事务。在一些名为A的实体类上,我声明了@Cacheable(true)注释。我从EJB bean调用一个方法,该方法更新a.class对象。第一次调用em.find(A.class,1)。我的问题是什么是搜索顺序。我展示我的思维方式 EntityManager在二级缓存中搜索实体。如果EM找到该对象,它会将该对象复制到一级缓存并停止搜索 ElseEntityManager在一级缓存中

我想了解JPA2中使用EclipseLink作为持久性提供者的缓存。我不知道我的想法是否正确

例如: 我使用JTA事务。在一些名为
A
的实体类上,我声明了
@Cacheable(true)
注释。我从EJB bean调用一个方法,该方法更新
a.class
对象。第一次调用
em.find(A.class,1)
。我的问题是什么是搜索顺序。我展示我的思维方式

  • EntityManager
    在二级缓存中搜索实体。如果
    EM
    找到该对象,它会将该对象复制到一级缓存并停止搜索
  • Else
    EntityManager
    在一级缓存中搜索实体。如果
    EM
    找到该对象,它将停止搜索
  • Else
    EntityManager
    在数据库中搜索实体。如果
    EM
    找到该对象,它会将该对象放入一级缓存并停止搜索

  • 当我找到object时,我修改了几个字段,我想调用
    em.merge(aClassRepresentant)
    。我认为当事务停止时,EntityManager会将合并的
    aClassRepresentant
    放入二级缓存并销毁自身。我想得对吗?

    问得好。因此,如果通过
    emf.getCache().executeAll()
    使二级缓存无效,那么在下一次查询中,返回到步骤1,我们将丢失对象的更新版本,因为一级缓存将被搜索?现在我认为应该交换步骤1和步骤2。一级缓存的生命周期类似于事务生命周期。当我们调用新的business方法时,一级缓存是空的。如果我们想在上一个缓存中找到一个实体,而二级缓存不包含该实体,则
    EntityManager
    从数据源获取搜索对象。如果在数据源中找到对象,EclipseLink将tat对象复制到一级和二级缓存。当然,我们必须使用
    EntityManager.find()
    方法或
    NameqQuery
    ,它通过
    id
    或放置在实体类上的
    @Index
    注释中定义的索引来获取实体。
    NamedQuery
    必须返回单个结果,如果没有,找到的实体将不会放置在二级缓存中…顺序将是EM缓存,然后是EMF缓存,然后是数据库。如果它访问数据库,并且它处于一个有更改的事务中,那么它读取的内容将只放在EM缓存中,直到事务提交,这时它将把它拥有的内容合并到EMF缓存中。问得好。因此,如果通过
    emf.getCache().executeAll()
    使二级缓存无效,那么在下一次查询中,返回到步骤1,我们将丢失对象的更新版本,因为一级缓存将被搜索?现在我认为应该交换步骤1和步骤2。一级缓存的生命周期类似于事务生命周期。当我们调用新的business方法时,一级缓存是空的。如果我们想在上一个缓存中找到一个实体,而二级缓存不包含该实体,则
    EntityManager
    从数据源获取搜索对象。如果在数据源中找到对象,EclipseLink将tat对象复制到一级和二级缓存。当然,我们必须使用
    EntityManager.find()
    方法或
    NameqQuery
    ,它通过
    id
    或放置在实体类上的
    @Index
    注释中定义的索引来获取实体。
    NamedQuery
    必须返回单个结果,如果没有,找到的实体将不会放置在二级缓存中…顺序将是EM缓存,然后是EMF缓存,然后是数据库。如果它访问数据库,并且它处于一个有更改的事务中,那么它读取的内容将只放在EM缓存中,直到事务提交,此时它将把它拥有的内容合并到EMF缓存中。