java - 实体、服务类和命令对象的最佳实践问题

标签 java spring spring-mvc

实体是直接映射到我们的数据库(我们用于 Hibernate)的类。

在调用 DAO 之前,我们的服务类包含这些实体的业务逻辑。

我们还有命令对象,它们是与特定 View 相关的 POJO。有人告诉我实体本身不应该用作命令对象,但我得到的“为什么”的答案是不够的。我希望这里有人能给我这个答案。

我们的一些观点非常简单。它们没有比实体本身更多的属性。将实体映射到基本上是实体镜像的命令对象对我来说似乎毫无意义。

最佳答案

看来你的对象命名可能有些困惑。命令对象通常提供单个 execute() 方法(带有参数),该方法对给定实体或域对象进行操作以根据业务逻辑更改其状态。这是一种将业务逻辑封装到简单对象中的非常巧妙的方法,这些对象的范围非常有限,无法改变其他对象。

这样看来,您正在使用的设计实际上在数据传输对象(DTO 或实体)和值对象(系统中的 VO 或命令对象)之间建立了某种桥梁。这可能非常浪费,因为您所做的只是将相同的数据复制到不同的对象中。

作用于数据传输对象(DTO 或实体)模式的数据访问对象 (DAO) 已经很好地建立并促进了层之间的良好分离。通常,Hibernate 会将实体映射到数据库,并延迟加载其中的集合。这是大多数设计出错的地方,因为它们不允许正确初始化集合,因为一旦执行线程离开 DAO, session 就消失了。我想 JSP 中的“命令对象”实际上是具有各种集合的实体的子集,这些集合已通过 Hibernate 查询进行了初始化。

我建议您放弃“命令对象”,转而使用适当初始化的实体,这样可以在一方面简化您的设计,但在另一方面却会面临潜在问题。您需要仔细控制 JSP 引用和初始化集合的方式。您可能会发现自己必须查看 Open Session In View 模式,以确保当 JSP 在某些尚未初始化的 DTO 上调用 getCollection() 方法时,Hibernate Session 对象可用。

关于java - 实体、服务类和命令对象的最佳实践问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017889/

相关文章:

java - Spring boot 以编程方式延迟启动Web应用程序

java - Netty 与 Apache MINA

java - 从rest java中的字符串列表获取值的问题

java - 如何在 th :if tag using thymeleaf 中有多个条件

java - Rest Api 调用使用 Spring Oauth2 给出错误 400

java - Spring @MatrixVariable 用于每个键单个值

java - 用于登录的WebSecurityConfigurerAdapter的配置

java - 字节好友 : how to defineField within a loop

java - 树形图获取与每个键关联的值的最大值

java - Spring Security OAuth2 纯资源服务器