我已经基于DDD概念开发了领域模型,几乎是面向对象的,并且其中包含状态和行为。问题是为了使用Hibernate,所有持久属性都必须具有getter和setter。这并不吸引人,因为我不想为域对象的某些属性引入设置器。我是否应该将域对象映射到DTO,其唯一目的是仅维护数据。

最佳答案

通常,这两个概念是相同的。域模型用于从问题域的角度描述您的对象的模型(即用于解决特定问题或问题集的信息),而实体模型用于从问题域的角度描述您的对象的模型。参与者系统的观点(在许多情况下,这是一些使用模型来解决问题并对实体采取行动的应用程序)。

因此,总的来说,它们是同一回事。

就是说,Hibernate非常灵活,通常不需要您对持久化对象结构做任何事情。关键在于如何定义映射。无论如何,我不建议拥有DTO来处理持久化数据。 Hibernate会在内部使用代理来完成所有工作……这就是工作。添加更多的类只会增加应用程序的复杂性,并不能带来太多好处。增加复杂性几乎从来不是一件好事。

使用Hibernate,您可以拥有私有的setter,或者让Hibernate仅在字段上操作而完全忽略getter / setter。在第一种情况下,您仍将引入一个setter,但是它是私有的,因此不会影响该类的公共API。使用字段访问,Hibernate不需要为属性设置任何getter或setter方法,但是它也可以解决您可能不得不做其他事情的任何逻辑,例如在对象上设置瞬态(非持久)属性。

通读Hibernate手册,尤其是在有关映射的部分。这是一个非常灵活的ORM,不会对您造成任何限制。

08-06 01:18