2014-01-24 98 views
0

我使用與MySQL數據庫冬眠,但具有單交易有多個更新麻煩冬眠多個更新查詢單筆交易

這裏是我的代碼

public void updateOEMUser(OEMUserDetailsDTO userDTO) throws Exception{ 
     Session session = GCCPersistenceMangerFactory.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try{ 
     String query = "update oemuserdata set full_name=\""+userDTO.getFullName()+ "\" ,contact_no=\""+userDTO.getContactNo() + "\" where user_id="+userDTO.getUserId(); 
     String query1 = "update usermasterdata set account_status="+userDTO.getAccountStatus() + " ,user_name=\"" + userDTO.getUserName() + "\" where user_id="+userDTO.getUserId(); 
     Query q = session.createSQLQuery(query); 
     Query q1 = session.createSQLQuery(query1); 
     tx = session.beginTransaction(); 
     q.executeUpdate(); 
     q1.executeUpdate(); 
     tx.commit(); 
    }catch (HibernateException e) { 
     if (tx!=null) tx.rollback(); 
     e.printStackTrace(); 
     throw new RuntimeException("HibernateException_updateOEMUser"); 
    }finally { 
     session.close(); 
    } 
} 

代碼工作,但是當我做「Q1。 executeUpdate()「使得」oemuserdata「中的記錄被鎖定在Mysql中失敗。

我做錯了什麼?

+0

爲什麼不使用HQL執行更新? –

+0

你怎麼讓q1.executeUpdate()失敗? –

+0

@will - 我在語句中添加了一個斷點並斷開了數據庫。 – shailesh

回答

1

嘗試使用這種模式。

StringBuilder query = new StringBuilder(); 
query.append("UPDATE CLASSNAME_FIRST a ,"); 
query.append("CLASSNAME_SECOND b,"); 
query.append("SET a.full_name='"+userDTO.getFullName()","); 
..... 

int var = stmt.executeUpdate(query); 
+0

我不認爲查詢有任何問題,因爲不僅我的功能正常工作,除非我讓它失敗,我有另一個功能,其行爲完全相同,我在查詢中使用POJO類,並使用session.createQuery()。 – shailesh

0

好吧我沒找到解決方案,但我發現這裏發生了什麼。

當我刪除q.executeUpdate()例外是在q1.executeUpdate執行拋出的成功執行後的連接()和catch塊後,它會在最後的塊並執行會議。關閉(),但由於沒有數據庫連接,這也失敗了。

但是Mysql仍然有鎖請求q.executeUpdate()。這就是爲什麼該行被鎖定,直到Mysql釋放鎖定自身。