领域模型和实体模型是否相同?

4

我有一个基于DDD概念开发的领域模型,非常面向对象,包含状态和行为。问题在于为了使用Hibernate,所有要持久化的属性都必须有getter和setter。这并不理想,因为我不想为我的领域对象中的某些属性引入setter。我应该将我的领域对象映射到DTO,而DTO的唯一目的是仅维护数据。


类似的问题在这里:https://dev59.com/d3E85IYBdhLWcg3wpFOu - Andrew Fielden
1个回答

3
一般来说,这两个概念是相同的。领域模型用于从问题域的角度(即用于解决特定问题或一组问题的信息)描述对象的模型,实体模型用于从一组参与者的角度(在许多情况下,这是使用模型解决问题和对实体进行操作的某个应用程序)描述对象的模型。
因此,一般来说,它们是相同的东西。
话虽如此,Hibernate非常灵活,并且通常不需要您对持久化对象结构做任何事情。关键在于如何定义映射。无论如何,我建议不要只为处理持久化数据而拥有DTO。Hibernate使用代理在内部完成所有操作...这就是它的工作。添加更多类只会增加应用程序的复杂性,而并没有真正提供太多好处。更多的复杂性几乎从来都不是一件好事。
在Hibernate中,您可以拥有私有setter,或者让Hibernate仅操作字段并完全忽略getter / setter。在第一种情况下,您仍然引入了setter,但它是私有的,因此不会影响类的公共API。使用字段访问时,Hibernate不需要存在属性的任何getter或setter,但它也绕过了您可能已经编写的任何逻辑以执行其他操作,例如在对象上设置瞬态(非持久化)属性。
请阅读Hibernate手册,特别是有关映射的部分。它是一种非常灵活的ORM,不会限制您超出必要的范围。

Hibernate会使用一些代理来访问私有的setter方法吗? - Thurein
是的。Hibernate使用的代理提供了所有访问私有字段、私有构造函数和私有setter所需的权限。正如我所说,阅读用户指南。它详细列出了所有选项,并且有很多很好的例子可以告诉你如何映射_你_想要的东西。 - cdeszaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接