Java 或 dotNet 世界有丰富的开源框架和库。我们几乎在任何地方都喜欢使用 Spring 和 Hibernate。每个人都同意hibernate是一个非常方便的工具。Hibernate 可以做什么?好吧,基本上 - Hibernate 可以跟踪我们的域对象更改并仅将修改后的数据保存到数据库中,就是这样。基本上,这就是我们想要的一切。我想从数据库中加载一些记录,对它们进行一些修改,然后调用 transaction.commit(),所有修改都会立即持久化。那太好了,对吧!
但是网络世界呢?在 Web 应用程序中,数据库会话必须关闭。我无法加载一些域对象并等待用户通过 HTTP 进行修改,并在修改后保留这些对象。
我们必须使用分离的对象或 DTO。这个怎么运作 ?用户在 HTML 浏览器中进行修改,spring Mvc 使用 MVC 模型绑定自动将这些 HTML 修改传递给我们自定义的 DTO 对象,然后我们进行一些编程工作以将修改从 DTO 对象传递到休眠域对象,然后我们才将它们持久化。例如 - 我们有一个更新客户地址的 Web 表单,以及另一个更新客户详细信息的表单。我们必须有两个不同的业务层方法——UpdateAddress() 和UpdateDetails(),这两个方法都必须接受某种DTO,一个代表地址信息,另一个代表细节信息。我们还有自定义逻辑,将数据从这 2 个 DTO 传输到域类“客户”。是的,当然,我们可以重用我们的域类,而不是 DTO 对象。但这并没有让它变得更简单。在这两种情况下,我们仍然必须实现将修改转移到持久对象的自定义逻辑,我不能立即持久化分离的对象,因为通常域类有很多很多属性代表许多关系,例如。客户有 - Orders 属性。当我更新客户地址时,我不想更新其订单。
是否有一种美观通用的方法可以将修改从 mvc 模型映射到域对象,而无需编写大量自定义代码并且没有覆盖太多字段的风险?