Spring MVC Hibernate在响应和请求之间保存Java Object

时间:2016-10-04 17:54:32

标签: java hibernate spring-mvc versioning spring-form

我正在详细解释我在申请中的申请流程。我正在研究数据库查看器应用程序。用户可以使用此应用程序查看我的数据库中的所有记录(行),并可以从UI进行编辑。这个应用程序工作正常。现在我想实现Optimistic Locking,因为我在DB中创建了一个版本字段。现在我遇到了一个设计问题,

到目前为止,在我的应用程序中,当用户查看记录并想要编辑它时,在我的控制器方法中,我正在进行Hibernate加载并在编辑JSP页面中显示结果。现在,当用户点击“保存”时在我必须做的页面保存记录。因为它是一个非常复杂的实体,所以我从DB中填充这个实体并进行更改并进行Hibernate保存或更新。

现在,我想实现版本控制,所以我不想再在保存或更新之前重新填充实体。不知何故,我想保持我的复杂实体安全,并在我想要更新时使用它。在我的情况下,JSP隐藏表单字段是不可能的。在用户点击“保存”之前,我可以在哪里保持我的实体安全无虞?按钮并使用它来持久存在于db?中。什么是可能的和最好的方法。

更新:

我已经审查了互联网上的各种帖子,并计划实施EHcache框架。

2 个答案:

答案 0 :(得分:1)

您有两种选择:

将状态存储在服务器(会话中)或客户端(隐藏表单字段中)。您可以使用HMAC保护客户端数据,但这需要处理时间。为方便起见,我建议使用服务器端会话

我的答案包括如何使用乐观锁定会话的示例:Spring MVC: Validation, Post-Redirect-Get, Partial Updates, Optimistic Concurrency, Field Security

答案 1 :(得分:0)

这就是@SessionAttributes("your-model") @Controller public class YourController { @RequestMapping(method = GET) public String show(long id, Model model) { // Get your entity model.addAttribute("your-model", entity); return "edit"; } @RequestMapping(method = POST) { public String show(@Valid @ModelAttribute("your-model") YourModel model, SessionStatus status) { // Save your entity status.setComplete(); return "list"; } } 的用途。无论您需要如何在某处存储对象,您都可以尝试乱搞并找出自己的对象或使用默认解决方案。

public ActionResult RedirectExample() {
      return RedirectToRoute("SearchDealbyPrice", new {CategoriesID = 9,FromPrice = 100,ToPrice = 200,Price = 0,GreenCars = 0,PageName= "Garrage"}); }

无论您的实施方式如何,您仍需要将您的数据(部分)存储在内存中。如前所述,您可以尝试黑客攻击自己的解决方案,或使用默认的弹簧机制。

像EhCache这样的解决方案仍会将内容缓存在内存中,如果需要可以卸载到其他存储中。您可以为会话配置相同(取决于您的容器)。或者使用类似Spring Session的内容来选择不同的选项。

无论如何,我会先将它存储在会话中,然后开始测量,如果确实成为一个问题,找出另一种方法将您的实体存储在请求之间。但是开始简单,衡量然后改进,而不是试图解决可能发生的问题。