Forms Spring表单控制器:无法在表单控制器中保存关系
我有三个表User、Role和UserRoleRelationships(多对多联接表)。在我的服务中,编辑用户和保存相关角色没有问题,但我无法在控制器中执行此操作 服务中的预期行为: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
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()中的用户模型似乎不返回角色,只返回发布的项目。我怎样才能让它同时返回角色
谢谢:)从评论中可以看出,角色“在流程功能中消失” 这表明您的表单或处理请求的方式有问题 我认为你有两个选择,取决于你想做什么:
- 如果不想更改用户角色(在此表单中),请使用用户数据传输对象,而不是
中的角色。然后,只需加载用户并使用dto中的数据对其进行更新processUpdateSubmit
- 如果要更改用户角色(在此表单中),则需要查找错误:
- 检查表单是否提交角色
- 检查转换器(角色id到角色)是否正常工作
- 检查spring是否可以访问用户对象中的角色集合
- 如果一切正常,则在
方法中设置断点a,然后在调用堆栈中返回user.setRole()
检查提交时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{/*实现*/}感谢所有帮助:)