我有一个JPA实体,其定义如下。它标记为只读,缓存设置为凌晨3点到期。
请考虑这种情况。 1.该表有一个deptId:100和部门名称:“SALES”
的记录使用
以编程方式获取记录entityManager.createNamedQuery("Department.findById").setParameter("depId",100) .getResultList();
返回的记录包含部门名称“SALES”
使用更新直接在后端数据库中修改上述记录数据 sqlquery的。将部门名称从“SALES”更改为“REGIONAL_SALES”
使用entityManager.createNamedQuery("Department.findById").setParameter("depId",100) .getResultList();
返回的记录包含更新的部门名称
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
}
答案 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
从我的角度来看,你的查询应首先点击缓存。
虽然您注释了@EmbeddedId
和int
类型的字段,但它很奇怪。
它是否适合您,因为它会导致以下异常?
Entity类(...)嵌入了 [class int]类型的tribute [id]不是Embeddable类。可能的原因:如果元数据完成
,则在orm.xml中缺少@Embeddable或缺少