在query.executeUpdate()hibernate之后,在提交之前查询时它不是更新的值

时间:2015-10-26 10:12:48

标签: hibernate

我正在尝试更新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,那么在第二次查询同一对象时,应返回包含更新值的本地缓存中的同一对象。但事实并非如此。

1 个答案:

答案 0 :(得分:0)

这是预期的。更新查询不会影响内存状态。由于您在执行更新查询之前已在会话中加载了该员工,因此其状态不受影响。

您需要清除会话或停止使用更新查询:只需使用

emp.setName("xyz");

这就是改变员工姓名所需的一切。

另请注意,选择查询也没用。您应该使用session.get()