【发布时间】:2014-11-12 22:49:05
【问题描述】:
我使用 JPA (EclipseLink)。我有实体类
@Entity
@Table(name = "my_table")
public class MyEntity implements java.io.Serializable {
@Id
@Column(name = "id")
int id;
@Column(name = "name")
String name;
@Lob
@Column(name = "data")
byte[] bytes;
//getters und setters are ommited
}
我有这样的疑问
Query query = entityManager.createQuery("SELECT m FROM MyEntity m WHERE m.name = :name");
在我第一次得到结果后,数据库中的data 字段发生了变化。但是当我下次运行这个查询时,我仍然得到旧值。任何人都可以向我解释这种行为并告诉我如何获得更新的价值
UPD:> 我调用 query.getResultList() 并获取 MyEntity 的实例。然后其他应用程序更改数据库中的数据并提交它(我可以运行 sql 语句,我看到它真的提交了)。然后我再次调用query.getResultList() 并获取包含旧数据的 MyEntity 实例。我的应用程序使用事务隔离级别 TRANSACTION_READ_COMMITTED。我已经通过
Connection c = entityManager.unwrap(Connection.class);
c.getTransactionIsolation();
UPD2: 我注意到,当我调用上述语句entityManager.unwrap(Connection.class) 时,行为就像在此调用后清除了缓存。在此调用之后,我通过调用query.getResultList() 获得更新的实例。我对此感到非常困惑。
【问题讨论】:
-
您需要显示数据如何更改以及何时更改(相对于您的重复查询),因为您的问题可能与事务管理有关。换句话说:对数据的更改可能尚未写入数据库。
-
我刚刚修复了我的应用程序中的一个缓存问题。我很确定你有同样的问题。查看 JPA 缓存 - 有很大帮助。
-
您是从同一个 entityManager 内部还是从 2 个不同的 entityManager 调用第一个和第二个查询?记住隐式使用的缓存级别 1。
-
来自同一个 entityManager
-
因此,除非您的 UPD2 的性能影响足以影响您的项目,否则您可能已经找到了解决方案
标签: java jakarta-ee jpa eclipselink