1. 程式人生 > >也來說說關於Hibernate使用update更新資料時,不更新的問題

也來說說關於Hibernate使用update更新資料時,不更新的問題

現在使用hibernate框架的雖然沒有前2年那麼多了,但是還是有很多專案在使用hibernate框架的,畢竟作為一個優秀的持久層框架,hibernate自然有存在的價值。

好了,廢話不多說,結合最近的使用,和大家一起探討一個hibernate經常遇到的問題:

問題描述:用SSH框架,開發專案時,進行修改操作時,比如修改密碼、修改某個表的某個欄位的資訊等等,初學者經常會遇到的一個問題是,專案沒有報錯,update操作執行了,就是資料庫的資料沒有更新。也就是說執行了update,但是資料並沒有更新。今天我嘗試用另一種方法,來完成這個問題。我不使用update,而是先delete,再save,因為update方法在使用時,確實會存在很多意想不到的情況,我們必須先分析我們的update操作會不會執行,是如何執行的,這對於初學者來說,是一個容易出現錯誤的地方。如果適用今天我介紹的這種方法,就好理解的多了。

先搞清楚這2段程式碼的區別:

User user;   //這是一個定義的物件,沒有例項化,如果我們用它來接收查詢出來的資料,也就是讓他指向查詢結果,此時,他就是hibernate裡的持久化狀態的物件;

User user = new User(); //這也是一個物件,已經例項化了,對hibernate來說,這是一個Transient(臨時狀態)的物件;

好,我先說一下幾個要點:

1,Hibernate中物件的3種狀態,這個一定要知道Transient(臨時狀態)、Detached(遊離狀態)、Persistent(持久化狀態);然後繼續;

2,業務需求大概是這樣的,我們在修改密碼時,一般都需要先進行oldPassword的驗證,如果正確,然後才會執行更新操作;

3,同樣的,我們可以採用另一種方法,查詢出來的持久化狀態的物件,先刪除,再通過setter方法賦值,再儲存;【有人會問,如果這樣來實現update,那如果一個表有N多個欄位,賦值的時候,不是要重複的寫N多個語句嗎?其實不用寫N多個語句,哪個欄位需要修改,就給哪個欄位賦值】

4,這裡我先執行this.getHibernateTemplate().delete(user);刪除user物件,然後給User物件賦值,然後執行儲存this.getHibernateTemplate().save(user);

通過執行,上述方法是能夠成功修改資料庫中的資料的,是可行的。還有幾個概念我們需要理清一下:

1,從資料查詢出來的資料,在沒有執行delete操作之前,是持久化狀態;

2,執行delete語句時,hibernate不會馬上去資料庫中刪除對應的記錄,而是要等事務提交以後,再統一執行;

3,我們執行delete操作時,我們要操作的這個物件User還存在於記憶體中,並且資料庫中的記錄也還在;

4,由於我們在事務提交之前執行了sava操作,所以能夠實現update的操作;

5,我們可以把hibernate理解為一個容器,一個處理物件的容易,只要物件進入了我這個容器,不管過程是怎樣的,不管執行了什麼操作,最後在出去的時候,都是統一處理的。所以,在使用hibernate框架實現業務需求時,hibernate是靈活的,在hibernate這個容器裡,你可以發揮自己的想象力,靈活應用。因為不管你怎麼操作,我都不會馬上去資料庫執行,不會影響資料庫的效能。