Forms Spring表单控制器:无法在表单控制器中保存关系

Forms Spring表单控制器:无法在表单控制器中保存关系,forms,hibernate,spring,controller,Forms,Hibernate,Spring,Controller,我有三个表User、Role和UserRoleRelationships(多对多联接表)。在我的服务中,编辑用户和保存相关角色没有问题,但我无法在控制器中执行此操作 服务中的预期行为: Hibernate: update dbo.Users set Username=?, Password=?, Email=?, Workphone=?, Privatephone=?, FullName=? where UserId=? Hibernate: update dbo.UserRoles set R

我有三个表User、Role和UserRoleRelationships(多对多联接表)。在我的服务中,编辑用户和保存相关角色没有问题,但我无法在控制器中执行此操作

服务中的预期行为:

Hibernate: update dbo.Users set Username=?, Password=?, Email=?, Workphone=?, Privatephone=?, FullName=? where UserId=?
Hibernate: update dbo.UserRoles set Role=? where RoleId=?
Hibernate: update dbo.UserRoles set Role=? where RoleId=?
但控制器中的行为是:

Hibernate: update dbo.Users set Username=?, Password=?, Email=?, Workphone=?, Privatephone=?, FullName=? where UserId=?
Hibernate: delete from UserRoleRelationships where UserId=?
我的控制器看起来像:

@RequestMapping(value = "/usermanagement/edit/{userId}")
public ModelAndView initUpdateForm(@PathVariable String userId, ModelMap model) {
    model.addAttribute("user", iwUserManagementService.getUser(Integer.valueOf(userId)));
    return new ModelAndView(viewName, model);
}

@RequestMapping(value = "/usermanagement/edit/{userId}", method = RequestMethod.POST)
public ModelAndView processUpdateSubmit(@ModelAttribute("user") IWUser iwUser,
        BindingResult result, SessionStatus status){
    iwUserManagementService.saveOrUpdate(iwUser);
    status.setComplete();

    return new ModelAndView("redirect:/usermanagement", new ModelMap("user", iwUser));
}
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
my web.xml的一部分:

@RequestMapping(value = "/usermanagement/edit/{userId}")
public ModelAndView initUpdateForm(@PathVariable String userId, ModelMap model) {
    model.addAttribute("user", iwUserManagementService.getUser(Integer.valueOf(userId)));
    return new ModelAndView(viewName, model);
}

@RequestMapping(value = "/usermanagement/edit/{userId}", method = RequestMethod.POST)
public ModelAndView processUpdateSubmit(@ModelAttribute("user") IWUser iwUser,
        BindingResult result, SessionStatus status){
    iwUserManagementService.saveOrUpdate(iwUser);
    status.setComplete();

    return new ModelAndView("redirect:/usermanagement", new ModelMap("user", iwUser));
}
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

冬眠过滤器
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
单一会话
假的
冲洗模式
自动的
sessionFactoryBeanName
会话工厂
冬眠过滤器
/*
对我来说,processUpdateSubmit()中的用户模型似乎不返回角色,只返回发布的项目。我怎样才能让它同时返回角色


谢谢:)

从评论中可以看出,角色“在流程功能中消失”

这表明您的表单或处理请求的方式有问题

我认为你有两个选择,取决于你想做什么:

  • 如果不想更改用户角色(在此表单中),请使用用户数据传输对象,而不是
    processUpdateSubmit
    中的角色。然后,只需加载用户并使用dto中的数据对其进行更新

  • 如果要更改用户角色(在此表单中),则需要查找错误:

    • 检查表单是否提交角色
    • 检查转换器(角色id到角色)是否正常工作
    • 检查spring是否可以访问用户对象中的角色集合
    • 如果一切正常,则在
      user.setRole()
      方法中设置断点a,然后在调用堆栈中返回

我通过添加@SessionAttributes(types=IWUser.class)自己修复了它:


检查提交时iwUser是否具有UserRoles。然后检查所具有的角色是否是附加到会话的角色。用户到角色的关系在类中是如何映射的?您的
User
类是否拥有
userrolrelationship
s的集合?@Ralph:角色在init函数中打印,但在process函数中消失@Nicolae Albu:用户拥有一组用户角色。正如我提到的,这在服务中正常工作。@jorgen:“但在流程函数中消失”--你是说它们在
processUpdateSubmit
方法参数中丢失了吗?@ralph:是的,似乎是这样的,因为用户角色是空的,所以被删除了。@jorgen:DTO是一个简单的对象,只包含要在视图中使用的属性。例如,如果您让该用户包含:first和last name以及roles和其他一些属性,并且您只想编辑first和last name,那么DTO只有这两个字段。我通过添加@SessionAttributes(types=IWUser.class):@Controller@SessionAttributes(types=IWUser.class)修复了它公共类UserUpdateControl{/*实现*/}感谢所有帮助:)