我正在尝试更新db中的记录,在提交记录之前,我想查看记录是否更新。不幸的是,它没有显示更新的结果。
public class MainApp {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
SessionFactory sessionFactory =HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Employee emp;
Transaction tx = session.beginTransaction();
// Get Employee with id
Query query = session.createQuery("from Employee where id= :id");
query.setLong("id", 3);
emp = (Employee) query.uniqueResult();
System.out.println("Employee ID : " + emp.getId() + " Employee name : " + emp.getName() + " ; Employee Salary : " + emp.getSalary() + " ; Employee City : " + emp.getAddress().getCity());
// Update Employee
query = session.createQuery("update Employee set name= :name where id= :id");
query.setParameter("name", "xyz");
query.setLong("id", 3);
int result = query.executeUpdate();
System.out.println("Employee Update Status=" + result);
// Get Employee with id
query = session.createQuery("from Employee where id= :id");
query.setLong("id", 3);
emp = (Employee) query.uniqueResult();
System.out.println("Employee Name=" + emp.getName() + ", City=" + emp.getAddress().getCity());
// closing hibernate resources
tx.commit();
session.close();
sessionFactory.close();
System.out.println("Success...");
}
}
在上面的代码中,我首先查询员工ID为3的员工,然后从" abc"更新该员工的姓名。到" xyz",然后查询同一名员工以查看其名称是否已更新。我仍然得到更老的名字,即" abc"。
如果hibernate首先在缓存中本地更新对象,并在提交事务时最终将其更新为db,那么在第二次查询同一对象时,应返回包含更新值的本地缓存中的同一对象。但事实并非如此。
答案 0 :(得分:0)
这是预期的。更新查询不会影响内存状态。由于您在执行更新查询之前已在会话中加载了该员工,因此其状态不受影响。
您需要清除会话或停止使用更新查询:只需使用
emp.setName("xyz");
这就是改变员工姓名所需的一切。
另请注意,选择查询也没用。您应该使用session.get()
。