首页 > 解决方案 > 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 中日期正在更改。如何返回实际数据?

标签: javaormentityjpqlentitymanager

解决方案


随着executeUpdate您执行 SQL 语句(直接修改 DB)但不更改由 Hibernate 加载/管理的实体,因此您在应用程序中保存了陈旧的数据。

最好的方法是始终使用由 Hibernate 管理并保存在一级缓存中的 Hibernate 实体。您的数据与数据库保持同步。

如果你真的需要运行一个语句(例如,因为它是一个复杂的语句或执行得更好),你需要驱逐实体并从数据库中重新加载它。


推荐阅读