2017-05-17 31 views
0

我在Internet上遵循一個簡單的Hibernate教程。看起來好像executeUpdate成功了(返回的行數是1)。但是,當我調用list()時,它返回了舊結果。這是休眠的預期行爲?無論如何,我可以在同一個交易中獲得更新的數據嗎?休眠executeUpdate成功,但列表操作不反映更改

這是我的源代碼:

//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

您再次執行相同的查詢,但你從來沒有犯下的第一transacation,因此你所做的更改從未堅持過。爲了解決這個問題,你可以嘗試提交你的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塊,如果發生異常,您將有機會回滾整個事務。

+0

以及如何成功更新回滾事務? – XtremeBaumer

+0

@Tim Biegeleisen爲什麼你使用'tx.commit();'選擇後,我認爲它應該在更新後? –

+0

@XtremeBaumer我在閱讀OP時看不到這個要求。你能否詳細說明你的評論? –

0

事務提交後,實際上將更改保存到DB,這是整個事務點。

如果您正面臨需要更新數據庫數據的場景,那麼需要進一步處理,您可以在駐留在持久化上下文中的對象上進行本地更新(在這種情況下,會更加註重做createOrUpdate而不是你的查詢),或分開兩個交易的兩個步驟