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

时间:2017-05-17 08:27:01

标签: java mysql hibernate

我在互联网上关注一个简​​单的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();

结果返回:

List of Employees::1,San Jose
List of Employees::2,Santa Clara
List of Employees::3,Bangalore
List of Employees::4,New Delhi
Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
Employee Update Status=1
Hibernate: select employee0_.emp_id as emp_id1_1_, employee0_.emp_name as emp_name2_1_, employee0_.emp_salary as emp_sala3_1_ from EMPLOYEE employee0_
List of Employees::1,San Jose
List of Employees::2,Santa Clara
List of Employees::3,Bangalore
List of Employees::4,New Delhi

3 个答案:

答案 0 :(得分:0)

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

tx.commit();

你应该使用的模式看起来像这样:

Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Employee");
List<Employee> empList = query.list();
// update, insert, etc.
tx.commit();

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

答案 1 :(得分:0)

提交事务后,更改实际上已保存到DB,即整个事务点。

如果您正面临需要更新数据库数据的场景,那么请将其进行进一步处理,或者在对象上进行本地更新,这些对象将驻留在持久性上下文中(在这种情况下,可以进行更多操作) createOrUpdate而不是您的查询),或将2个事务中的两个步骤分开

答案 2 :(得分:0)

我认为,一旦更新成功,您正在寻找对update到数据库和rollback的测试。如果是这样,您必须在交易中拥有savePoint。这篇文章Creating savepoint and rollingback in hibernate可能会有所帮助。