Java Hibernate executeUpdate已成功,但列表操作不反映更改

Java Hibernate executeUpdate已成功,但列表操作不反映更改,java,mysql,hibernate,Java,Mysql,Hibernate,我正在网上学习一个简单的Hibernate教程。executeUpdate似乎成功(返回的行数为1)。然而,当我调用list()时,它返回了旧的结果。这是hibernate的预期行为吗?我是否可以在同一事务中获取更新的数据 这是我的源代码: //Prep work SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.getCurren

我正在网上学习一个简单的Hibernate教程。executeUpdate似乎成功(返回的行数为1)。然而,当我调用list()时,它返回了旧的结果。这是hibernate的预期行为吗?我是否可以在同一事务中获取更新的数据

这是我的源代码:

//Prep work
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session session = sessionFactory.getCurrentSession();

    //Get All Employees
    Transaction tx = session.beginTransaction();
    Query query = session.createQuery("from Employee");
    List<Employee> empList = query.list();
    for(Employee emp : empList){
        System.out.println("List of Employees::"+emp.getId()+","+emp.getAddress().getCity());
    }
    //Update Employee
    query = session.createQuery("update Employee set name= :name where id= :id");
    query.setParameter("name", "Pankaj Kumar");
    query.setLong("id", 1);
    int result = query.executeUpdate();
    System.out.println("Employee Update Status="+result);


    query = session.createQuery("from Employee");
    empList = query.list();
    for(Employee emp : empList){
        System.out.println("List of Employees::"+emp.getId()+","+emp.getAddress().getCity());
    }

    //rolling back to save the test data
    tx.rollback();

    //closing hibernate resources
    sessionFactory.close();

您再次执行相同的查询,但从未提交第一个事务,因此所做的更改从未持久化。要解决此问题,可以尝试提交Hibernate事务:

tx.commit();
您应该使用的模式如下所示:

Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Employee");
List<Employee> empList = query.list();
// update, insert, etc.
tx.commit();
Transaction tx=session.beginTransaction();
Query Query=session.createQuery(“来自员工”);
List empList=query.List();
//更新、插入等。
tx.commit();

请注意,这应该发生在try-catch块中,如果发生异常,您将有机会回滚整个事务。

事务提交后,更改实际上保存到数据库中,这就是整个事务点


如果您面临需要更新数据库上的数据的场景,那么您可以在驻留在持久性上下文中的对象上本地更新数据以进行进一步处理(在这种情况下,执行createOrUpdate而不是查询会更有意义),或者在两个事务中分离这两个步骤

我假设您正在寻找对数据库进行
更新
并在更新成功后进行
回滚
。如果是这样,您必须在事务中设置
保存点。这篇文章可能会有帮助。

即使更新成功,如何回滚事务?@Tim Biegeleisen为什么使用
tx.commit()在选择之后,我认为应该在更新之后?@XtremeBaumer我在阅读OP时没有看到这个要求。你能详细说明一下你的评论吗?在他的代码中他得到了这样的信息:
//回滚以保存测试数据tx.rollback()这让我觉得他总是想在运行testYes之后恢复测试数据,但这与能够“查看”数据库中的数据相冲突。要么更新已提交,要么未提交,这两种方式都无法实现。
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Employee");
List<Employee> empList = query.list();
// update, insert, etc.
tx.commit();