【发布时间】:2017-11-17 07:14:29
【问题描述】:
我正在使用 thymeleaf 和 Spring 和 Hibernate 构建一个 MVC 应用程序。我的问题更多的是关于休眠而不是春天。
这是我到目前为止所拥有的。
用户界面
<form role="form" th:action="@{/user/{userId}/official(userId=${userId})}" th:object="${user}" method="post">
<!-- first form group -->
<div class="form-group">
<label class="control-label col-xs-2">First Name</label>
<div class="col-xs-2">
<input type="text" class="form-control" th:field="*{firstName}" placeholder="First Name" />
</div>
<label class="control-label col-xs-2">Last Name</label>
<div class="col-xs-3">
<input type="text" class="form-control" th:field="*{lastName}" placeholder="Last Name" />
<!-- first form group end -->
</div>
<br/><br/>
<!-- third form group -->
<div class="form-group">
<label class="control-label col-xs-2">Email Address</label>
<div class="col-xs-2">
<input type="text" class="form-control" th:field="*{emailAddress}" placeholder="Email Address" />
</div>
</div>
<div class="form-group">
<div class="col-xs-2">
<input type="submit" value="Update" class="btn btn-primary" />
</form>
控制器:
@Controller
public class UserController {
@Autowired
private IUserService userServiceImpl;
@RequestMapping(value = "/user/{userId}/official", method = RequestMethod.GET)
public String getUserOfficialInfo(@PathVariable("userId") Integer userId, Model model) throws ServiceBusinessException {
UserBO userBO = userServiceImpl.findUserByUserId(userId);
model.addAttribute("user", userBO);
model.addAttribute("userId", userId);
model.addAttribute("genders", EnumSet.allOf(Gender.class));
return "official";
}
@RequestMapping(value = "/user/{userId}/official", method = RequestMethod.POST)
public String updateUserOfficialInfo(@PathVariable("userId") String userId, @ModelAttribute("user") UserBO user,BindingResult result, Model model) throws ServiceBusinessException {
userServiceImpl.updateUser(user);
UserBO userBO = userServiceImpl.findUserByUserId(Integer.parseInt(userId));
model.addAttribute("user", userBO);
model.addAttribute("userId", userId);
model.addAttribute("genders", EnumSet.allOf(Gender.class));
return "official";
}
}
道:
@Override
public void updateUser(UserEntity user) throws DaoException {
entityManager.merge(user);
}
控制器中的 GET 方法,将用户对象获取到视图。但在视图中,我只是在表单中显示用户对象的一些属性。
在提交表单上,调用控制器中的 POST 方法,该方法调用服务层,然后执行 DAO 中的合并方法。
现在我观察到的是,实体管理器上的这种合并方法正在将表单中不存在的属性更新为 null。
我认为这是预期的行为,因为对象在从 POST 方法调用时被分离。所以这里正确的做法是首先从数据库中获取实体对象,然后对该对象设置表单中更改的字段,然后调用合并方法。
有人可以告诉我以上我说的是否正确吗?
如果是,那么我的下一个问题是,这不是很乏味,而且需要更多的努力。我的意思是在某些情况下,我不想在表单中显示整个对象。也不在隐藏字段中。我很惊讶没有办法处理这个问题,我每次都必须遵循我上面描述的方法。
有没有更好的方法来做到这一点?我不会只使用 JDBC 模板吗?我知道我会在那里编写样板代码,但我也会在这里为 UI 的每次往返编写 getter 和 setter。
【问题讨论】:
-
Hibernate 对表单一无所知。我见过的典型模式是从数据库加载实体,将表单中的字段映射到实体,然后持久化实体。我相信有一些弹簧管道可以帮助解决这个问题,但我不记得谷歌应该找到它的具体细节。
标签: java spring hibernate spring-mvc