【问题标题】:JPA Query misunderstandingJPA查询误解
【发布时间】: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


【解决方案1】:

由于有另一个应用程序更改了数据,因此您的缓存已过时。因此,您的问题本质上与以下内容重复:EntityManager doesn't see changes made in other transactions

请尝试那里接受的答案中提出的建议,看看这对您的问题有什么作用。

编辑:清除缓存通常取决于供应商,因此您必须搜索供应商的文档。对于 EclipseLink,这看起来很有希望:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching#How_to_refresh_the_cache

EDIT2:由于您使用EntityManager,您可以直接尝试:

em.getEntityManagerFactory().getCache().evictAll();

【讨论】:

  • 谢谢,这有帮助。请阅读我的第二个 UPD,我只是越来越困惑
【解决方案2】:

如果您不想缓存实体,可以尝试将其标记为不可缓存:@Cacheable(false)

@Entity
@Table(name = "my_table")
@Cacheable(false)
public class MyEntity implements java.io.Serializable { 

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2018-10-18
    • 2016-02-15
    • 2021-05-26
    相关资源
    最近更新 更多