首页 > 解决方案 > 如何使用 Spring 事务管理将当前用户更新到数据库?

问题描述

例如:登录用户是 [test2],我想更新mAccountmPassword.
如何获取登录会话并单击 jsp 表单进行更新?

mId是主键)

我该怎么办?

当我点击提交更新SQL数据库时,mAccountmPassword没有更新。

我认为我的控制器必须有问题才能获得登录会话,所以我无法更新我想要的内容。我一次又一次地点击,但 SQL 数据库仍然没有任何变化,控制器没有得到 test2 对象来更新。如何修复控制器让我很困惑和焦虑。这个问题花了我 1 周的时间......

SQLMember数据库:

在此处输入图像描述

编辑: 与上面的图像相同,可能缺少预期的一种 UpdateMemberController调试模式:

<code>UpdateMemberController</code> 调试模式

豆:

private Integer mId;
private String mAccount;
private String mPassword;
private String mName;
private Date mDate;
private String mPhone;
private String mAddress;
private String mGender;
private String mEmail;

会员道:

public void setConnection(Connection conn);
public boolean checkAccount(String mAccount);
public int registerMember(MemberBean mb);
public MemberBean queryMember(String mAccount);
public MemberBean checkPassword(String mAccount, String mPassword);
public void updateMember(MemberBean mb);

道实现:

@Override
public void updateMember(MemberBean mb) {

    String hql = "UPDATE MemberBean mb SET mb.mAccount =:mAccount , mb.mPassword =:mPassword WHERE mId =:mId";
    Session session = factory.getCurrentSession();

    session.createQuery(hql).setParameter("mAccount", mb.getmAccount()).setParameter("mPassword", mb.getmPassword())
            .setParameter("mId", mb.getmId()).executeUpdate();

}

会员服务:

boolean accountCheck(String mAccount);
int registerMember(MemberBean mb);
MemberBean queryMember(String mAccount);
public MemberBean checkPassword(String mAccount, String mPassword);
void updateMember(MemberBean mb );

成员服务实现:

@Transactional
@Override
public void updateMember(MemberBean mb) {
    if (mb.getmAccount() != null && mb.getmPassword() != null) {
        dao.updateMember(mb);
    }
}

标签: javaspringhibernatespring-mvcspring-transactions

解决方案


如果开发人员掌握了调试技能,就没有比这更大的挑战了。如果有什么对开发人员造成问题,他应该抓住它的脖子并解决它。

  1. 检查您连接的数据库的 hibernate.properties。如果您连接到不同的数据库,则可能会在那里进行更新。(如果step1没有问题)

  2. 直接跳转调试你的dao实现。(updateMember()方法)

    • 确认 updateMember 方法是否被调用。(只需输入打印语句)
    • 首先打印 mAccount、mPassword 和 mId
    • 如果打印正确,则在 try catch 块中放入 create query 并执行 update,不要忘记在 catch 块中打印。
    • 如果未捕获异常,则打印 executeUpdate 返回类型。
    • 如果 executeUpdate 为零,则转到步骤 3。

第 3 步:为什么它没有更新到数据库。我在提交交易吗?
如果我依赖 spring 来管理事务(开始、提交/回滚)然后问自己我是否正确配置了它?
(即使我没有在 Spring 中处理 Transaction,让我猜猜你的问题)
Spring 容器是否使用 @Transactional 获取服务方法?
你的组件扫描基础包是什么?您的服务的包名称是什么?
您的服务类是否已扫描组件?

笔记:

在您的问题中添加必要的信息
添加 servlet-context.xml(在 xml 配置中)或等效的 java 配置文件
添加 root-context.xml(在 xml 配置中)或等效的 java 配置文件

过滤问题或删除不必要的信息
Bean(必需)
MemberDao(必填)
MemberService(必填)
MemberServeImpl(必填)
控制器(非必填)
jsp(非必填)

推荐阅读