Hiberate更新時報エラーa different object with the same identifier value was already associated with the session

4903 ワード

Hibernateフレームワークを使用しており、Serviceクラスには次のような方法があります.
 1 public boolean saveOrUpdateTroop(TroopsInfo o, Boolean save) {

 2         if (save) {

 3             Map<String, Boolean> existeds = this.troopsDAO.getExisted();

 4             Boolean flag = existeds.get(o.getName());

 5             if (flag != null && flag) {

 6                 return false;//           

 7             }

 8             this.troopsDAO.saveOrUpdate(o);

 9         }else {//  

10             TroopsInfo old = this.troopsDAO.findUniqueBy("id", o.getId());

11             if (old.getName().equals(o.getName())) {

12                 //               

13                 this.troopsDAO.saveOrUpdate(o);

14             }else {//         

15                 Map<String, Boolean> existeds = this.troopsDAO.getExisted();

16                 Boolean flag = existeds.get(o.getName());

17                 if (flag != null && flag) {

18                     return false;//           

19                 }

20                 this.troopsDAO.saveOrUpdate(o);

21             }

22             this.emergencyPersonDAO.updateEPerson(o.getId(), o.getName(), o.getContact());

23         }

24         

25         return true;

26     }

実際に実行すると、13行目(前の条件に従ってここにジャンプ)でエラーが発生します.a different object with the same identifier value was already associated with the sessionです.
解決方法:後でmerge()方法に変えればいいです.
理由:コンテキストから見ると、ここでは保存前にデータベースからデータを1回取り出し(sessionキャッシュに入れる)、保存しています.hibernateの公式ドキュメントによると、updateの説明は次の通りです.
Update the persistent instance with the identifier of the given detached instance,if there is a persistent instance with the same identifier,an exception is thrown.だから上の間違いはよく説明されました.
同様に,hibernateのmerge法の解釈は,copy the state of the given object onto the persistent object with the same identifier,if there is no persistent instance currently associated with the session,
it will be loaded...
もう1つの解決策はrefresh()またはclean()ですが、他のエラーが報告されるので、推奨しません.