我在互联网上关注一个简单的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
答案 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可能会有所帮助。