在这些情况下,帮助决定何时使用DTO和何时使用实体的一般想法是什么?
- UI /服务器端Java调用服务。它应该获取/发送实体还是DTO?
- Web服务调用服务。服务应该接受实体还是DTO?
我喜欢阅读传递实体的代码:
- 更简单地传递,不需要映射到DTO
- 不需要额外的类
- 与其他实体的关系已经定义,因此不需要将相关的DTO合并为一个DTO
- 只是POJOs
但是有人认为DTO映射到实体更安全,因为它是一种契约,实体可以更改为任何形式,而DTO将保持不变。例如,实体具有名称字段,DTO也具有名称字段。以后,如果要求更改,数据库表更改,实体也会更改,将名称更改为名字和姓氏。但是DTO仍将具有名称字段,即名字+姓氏。
因此,以下是使用DTO的优点列表:
- 从接受DTO的代码的角度来看向后兼容
我能想到的DTO缺点是:
- 必须定义DTO类和映射(可能使用dozer)
- 程序员必须分析何时使用DTO和实体,我的意思是将DTO传递给每个方法都很混乱
- 实体与DTO之间的转换开销以及反之亦然
- 我仍然不确定如何映射一对多关系。在JPA中,我们可以惰性初始化它,但在传递DTO时,我应该初始化它还是不初始化它。简而言之,DTO不能有延迟初始化代理,只包含值。
请分享你的想法..
谢谢!
以下是来自不同地方的一些引用
绝对不是!!! JPA实体被映射到数据库,但它们并没有与数据库“绑定”。如果数据库发生变化,您需要更改映射而不是对象。对象保持不变。这就是整个重点!重用实体类作为DTO似乎很混乱。类的公共API(包括公共方法上的注解)不再清楚地定义它所呈现的合同的目的。当类被用作DTO时,它将最终具有仅相关的方法,而当类被用作实体时,一些方法将仅相关。关注点不会被干净地分离,事情会更加紧密耦合。对我来说,这是一个比试图节省创建的类文件数量更重要的设计考虑。