该问题特定于持久上下文(L1)中的缓存,而不是二级缓存。
我想知道为什么在使用 JPQL 选择/重新加载实体时不会刷新持久上下文缓存中的实体。
使用示例解释问题:
- 事务 A 开始
- 将实体 A 加载到事务 A 的持久上下文中。
- 事务A中的一些其他处理。但是加载的实体没有被修改。同时,同一实体在另一个事务 B 中(即另一个持久上下文中)被修改和提交。
- 使用 JPQL(select 子句)重新加载事务 1 中的实体 A。实体 A 具有陈旧的属性。
我在日志中验证了查询已被触发。那为什么实体A没有刷新呢?
最佳答案
这就是一级缓存的工作方式。当 OpenJPA 读取查询的结果集时,它会检查结果集行的 id 字段。如果具有该 id 的实体已存在于持久性上下文中,则使用现有实体并忽略结果集行的其余部分,这意味着不会再次组装该实体。
如果您想强制重新加载实体实例,您可以:
- Refresh它。
- Detach这样,当持久性提供程序在其执行的任何后续操作中查找新的托管托管托管托管托管托管托管托管帐户时,将从数据库加载新的托管托管托管托管托管托管托管托管托管帐户。
- Clear整个持久化上下文,以便持久化提供程序在同一事务中的任何后续操作中再次重新加载所需的所有内容。
根据用例,您可能需要 flush在应用上述任何操作之前,您可能在要刷新/分离/清除的实例中所做的任何更改,否则这些更改将不会与数据库同步。
关于java - OpenJPA 在使用 JPQL(选择查询)重新获取实体时不会刷新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34671351/