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

时间:2011-07-18 08:50:47

标签: 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 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));
}

我的web.xml的一部分:

<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>

对我来说,看起来processUpdateSubmit()中的用户模型不返回角色,只返回已发布的项目。我怎样才能让它返回角色呢?

谢谢:)

2 个答案:

答案 0 :(得分:0)

从评论中可以看出角色“在流程函数中消失了”。

它表示您的表单或处理请求的方式存在问题。

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

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

  • 如果您想更改用户角色(在此表单中),那么您需要找到错误:

    • 检查表单是否提交角色
    • 检查转换器(角色ID到角色)是否正常
    • 检查spring是否可以访问用户对象中的角色集合。
    • 如果一切正常,那么设置一个断点为user.setRole()方法并在调用堆栈中向后移动。

答案 1 :(得分:0)

我自己修改了@SessionAttributes(types = IWUser.class):

@Controller 
@SessionAttributes(types = IWUser.class) 
public class UserUpdateController { /* implemenation */ }