【问题标题】:executeUpdate in createQuery does not update my databasecreateQuery 中的 executeUpdate 不会更新我的数据库
【发布时间】:2020-10-07 07:58:26
【问题描述】:
public void updateUserState(User user) {
        Session sess=getSession();
        sess.setFlushMode(FlushMode.MANUAL);
        String queryStr = "update User usr set usr.logCount = :logCount , usr.isLocked = :isLocked , usr.lastLogin = :lastLogin where usr.userId=:userId";
        Query query=null;
        query = sess.createNativeQuery(queryStr);
        query.setParameter("logCount", user.getLogCount());
        query.setParameter("isLocked", user.getIsLocked());
        query.setParameter("lastLogin", user.getLastLogin());
        query.setParameter("userId", user.getUserId());
        query.executeUpdate();
}

这是我的代码。这不会更新数据库中的 mu 用户表,也不会引发任何错误。它反映了设置参数之前的正确值,但在执行更新之后,我在表中看不到任何更新。如果你们中的任何人能告诉我,我哪里出错了,那就太好了。提前致谢!

【问题讨论】:

  • 我最后没有看到电话Session.flush()
  • 我也试过这个,但是 Session.flush() 也没有帮助。
  • 您是否在事务中运行此代码? Transaction txn = session.beginTransaction(); ... txn.commit();
  • 是的,我正在这样做。

标签: mysql sql hibernate createquery


【解决方案1】:

根据休眠documentation刷新类型MANUAL假设:

会话刷新被委托给应用程序,该应用程序必须显式调用Session.flush() 才能应用持久性上下文更改。

因此,您应该在方法的末尾显式调用Session.flush()

您的updateUserState 方法也应该在transaction 内运行:

Session sess = getSession();
sess.setFlushMode(FlushMode.MANUAL);
Transaction txn = sess.beginTransaction();
// ...
query.executeUpdate();

sess.flush();
txn.commit();
session.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2021-07-06
    相关资源
    最近更新 更多