私は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も完全にフェッチされます。
この点についてお手伝いください。
コードに問題があります。 –
私のコードを投稿させてください –
あなたは値を読み取り、インクリメントするコードを投稿していません。コードの残りはどこにありますか? –