2017-09-05 12 views
0

私はspring mvcで休止状態を使用しています。 私は、Webアプリケーション全体にシングルセッションファクトリインスタンス/スレッドを使用しています。 リクエストごとにセッションオブジェクトを使用しています。Hibernateが最大のIDを取得している間に古いオブジェクトを取得しています

私は最大のIDをフェッチしています、それは私に正しい値を与えているし、私は同じインクリメントされた最大IDでテーブル内の何かを更新しています。

私が直面している問題は、最大IDを再度取得すると、同じ以前の最大IDが返されますが、更新されたIDは返されません。

トリッキーな部分は、私が再び試してみると例外が来たときに、それは私に正しい最大ID値を与えています。

注:すべての最大IDフェッチ時に、私は新しいセッションオブジェクトを開き、最後にそれを閉じています。

これは私のコードです: -

public static void prepareLogin(HttpServletRequest request, 
      String loggedUser, int loggedUserType, int loggedUserId) { 


     Session session = HibernateUtil.openSession(); 
     Transaction tr = session.beginTransaction(); 

     // fetching the max id from login manager table to update the login and 
     // logout or various details 
     int loginManagerMaxIdInt = 0; 
     Criteria c2 = session.createCriteria(LoginManager.class); 
     c2.addOrder(Order.desc("id")); 
     c2.setMaxResults(1); 
     LoginManager loginManager = (LoginManager) c2.uniqueResult(); 
     if (loginManager != null) { 
      loginManagerMaxIdInt = loginManager.getId(); 
     } 

     loginManagerMaxIdInt++; 

     System.out.println("logManId: " + loginManagerMaxIdInt); 

     // preparing the new loginManager object to be stored in the DB 
     LoginManager newLoginManager = new LoginManager(); 
     newLoginManager.setId(loginManagerMaxIdInt); 
     newLoginManager.setUserId(loggedUserId); 
     newLoginManager.setLoginTime(new Date(System.currentTimeMillis())); 
     UserTypeMaster userTypeMaster = new UserTypeMaster(); 
     userTypeMaster.setId(loggedUserType); 
     newLoginManager.setUserTypeMaster(userTypeMaster); 

     // binding the username, userType and loginManager id value to 
     // the session 
     // object 
     request.getSession().setAttribute("loggedUser", loggedUser); 
     request.getSession().setAttribute("loggedUserType", loggedUserType); 
     request.getSession().setAttribute("loggedLoginManagerId", 
       loginManagerMaxIdInt); 

     // finally saving it and commiting 
     session.save(newLoginManager); 
     tr.commit(); 
     session.close(); 

    } 

第二編集:

// logout method to logout the user by just invalidating the session object 
// because in that session object only all important object are bind 
@RequestMapping(value = "/logout", method = RequestMethod.GET) 
public ModelAndView logout(HttpServletRequest request) { 

    //new session 
    Session session = HibernateUtil.openSession(); 
    //begin transaction logout time updation 
    Transaction tr = session.beginTransaction(); 

    //fetching the login_Manager row from login_manager table for current 
    //logged User 
    LoginManager loginManager = (LoginManager) session.get(
      LoginManager.class, 
      Utility.getLoggedLoginManagerId(request)); 

    //changing the logut time to current time in the fetched object 
    loginManager.setLogoutTime(new Date(System.currentTimeMillis())); 

    //updating the same object to the db 
    session.update(loginManager); 
    tr.commit(); 

    //invalidating the sessin object 
    request.getSession().invalidate(); 

    //finally closing the session 
    session.close(); 
    return new ModelAndView("redirect:" + "login"); 
} 

ノート:私の場合 このオブジェクトを保存した後、私は次のコードでDBに同じオブジェクトを更新していますこの2番目のメソッドを実行しないでください私のコードは正常に動作しています。つまり、新しいオブジェクトのみを保存すれば、すべてが正常で最大IDも完全にフェッチされます。

この点についてお手伝いください。

+0

コードに問題があります。 –

+0

私のコードを投稿させてください –

+0

あなたは値を読み取り、インクリメントするコードを投稿していません。コードの残りはどこにありますか? –

答えて

-1

セッションフラッシュについて読むと、セッションデータをデータベースと同期させます。セッションが同期されていない場合、更新されたデータは表示されません。

例:行をコミット/更新する前にセッションをフラッシュすると、予期した結果が表示されませんが、次回フラッシュでトリック(データベースとのセッションを同期)する必要があります。

実際にデータベースの実際の状態で新しいセッションを開いている場合は、その理由があります。この記事では私の悪い質問のためのすべての申し訳ありませんの

+0

あなたは同じ –

+0

のために推奨された記事を共有してください。私は 2

0

まず。

この問題はこの<property name="hibernate.connection.isolation">2</property>に関連していました。

私の設定ファイルに上記のコードを追加したところ、すべて正常です。

関連する問題