OpenJPA在使用JPQL重新获取实体时不刷新实体(选择查询)

时间:2016-01-08 07:11:10

标签: java jpa openjpa

这个问题特定于持久化上下文(L1)中的缓存,而不是二级缓存。

我想知道为什么在使用JPQL选择/重新加载实体时不会刷新Persistent上下文缓存中的实体。

使用示例解释问题:

  1. 交易开始A
  2. 在事务A的持久上下文中加载实体A.
  3. 事务A中的一些其他处理但是未加载已加载的实体。同时,在另一个事务B中修改并提交相同的实体,即在另一个持久的上下文中。
  4. 使用JPQL(select子句)在事务1中重新加载实体A.实体A具有陈旧属性。
  5. 我在日志中验证了查询被触发了。那为什么实体A没有刷新?

1 个答案:

答案 0 :(得分:1)

这是第一级缓存的工作方式。当OpenJPA读取查询的结果集时,它会检查结果集行的id字段。如果具有该id的实体已存在于持久性上下文中,则使用现有实体,并忽略结果集行的其余部分,这意味着实体不会再次组合。

如果您想强制重新加载实体实例,您可以:

  1. Refresh它。
  2. Detach这样当持久性提供程序在它执行的任何后续操作中查找它时,将从数据库加载新的托管数据。
  3. Clear整个持久化上下文,以便持久性提供程序再次重新加载它在同一事务中的任何后续操作中所需的所有内容。
  4. 根据用例,您可能希望flush在应用上述任何操作之前,您在要刷新/分离/清除的实例中所做的任何更改,否则这些更改将不会同步与数据库。