java - JPQL 和实体数据
问题描述
我的实体 Student 有两个字段:id、名称我使用 entityManager persist() 将其保存在基础中,然后使用 JPQL 更新一个实体并获取它。实体中的数据是旧的。为什么?但在数据库中,实体的所有数据都在变化。
public class Main {
public static void main(String[] args) {
EntityManagerFactory myFactory = Persistence.createEntityManagerFactory("myPerName777");
EntityManager entityManager = myFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(new Student("max"));
entityManager.persist(new Student("max"));
entityManager.persist(new Student("max"));
entityManager.persist(new Student("mike"));
entityManager.persist(new Student("mike"));
transaction.commit();
transaction.begin();
Query query = entityManager.createQuery("UPDATE Student s set s.userrname='JOHN' where s.id=1");
query.executeUpdate();
transaction.commit();
Student student = entityManager.find(Student.class,1);
System.out.println(student.getUserrname());
entityManager.close();
myFactory.close();
}
}
此代码返回 Max,但在 DB 中日期正在更改。如何返回实际数据?
解决方案
随着executeUpdate
您执行 SQL 语句(直接修改 DB)但不更改由 Hibernate 加载/管理的实体,因此您在应用程序中保存了陈旧的数据。
最好的方法是始终使用由 Hibernate 管理并保存在一级缓存中的 Hibernate 实体。您的数据与数据库保持同步。
如果你真的需要运行一个语句(例如,因为它是一个复杂的语句或执行得更好),你需要驱逐实体并从数据库中重新加载它。
推荐阅读
- delphi - 以与 SDI 模态窗体相同的方式闪烁窗口框架
- c# - 在使用统一的 ARKIT 中,如何将模型仅放置在一个特定方向上?
- twitter-bootstrap - 如何使用 Bootstrap 将按钮偏移对齐到表单的左侧或右侧
- c# - 在 Visual Studio 中删除应用程序文件
- javascript - ReactJS 中的条件 HOC
- python - 使用 PyTorch 的多标签、多类图像分类器 (ConvNet)
- jquery - 点击按钮切换iframe?
- garbage-collection - Kubernetes pod 在较长的 GC 周期中自动重启
- flutter - 在 Flutter 中为列和行分配权重
- php - 如何在for循环php中显示图像?