2017-09-14 188 views
2

有些类是根据DDD的实体,并且有些类具有@javax.persistence.Entity注释。他们应该是同一班吗?还是JPA实体只是作为映射器的机制(https://martinfowler.com/eaaCatalog/dataMapper.html)从数据库加载DDD实体(并存储它们)并保持在域模型之外?JPA实体和DDD实体应该是相同的类吗?

如果数据库元数据被分离并存储在外部(例如,以XML格式),它会有所帮助吗?如果这些类是实体,那么边界在哪里?我认为从XSD(例如,使用JAXB)或者使用MyBatis Generator数据库生成的类不是DDD中理解的实体。

回答

2

这实际上是一个实现细节。他们可能会或不能依靠您的ORM的灵活性。例如,如果您的ORM允许映射您的域对象而不会对持久性问题造成污染,那么这就需要较少的开销和我要去做的方法。另一方面,如果你的ORM不够灵活,那么你可以采用务实的混合方法,其中你的AR和它的状态是两个不同的类,并且状态类很容易被映射。请注意,AR仍然负责保护其状态,并且状态对象不会直接从AR外部访问。该方法由Vaughn Vernon here描述。

+0

感谢您的精湛回答! 'AR' =='Aggregate root',我假设。我还没有读VV的书。因此,如果JPA实体被视为隐藏在AR背后的普通DTO,那么它一定没问题。在这种情况下,我们是否应该为同一个DTO图形创建不多于一个AR类? –

0

您的JPA实体应该是域实体。为什么? 您的域名实体应表达一些强大的约束条件,例如通过

  • 包含参数的构造函数
  • 不公开所有制定者
  • 做验证的写操作

如果可能,域实体应该始终保持一个有效的商业实体。 通过引入某种映射器,您可以自动将任意东西写入您的域实体,这基本上可以使您的约束无用。

另一种选择是对JPA和导致冗余的域实体施加相同的约束。

最好的办法是让您的JPA实体尽可能保持ORM不可知性。使用Hibernate,这可以使用配置类或XML文件来完成。但我不是Java EE/JPA的人,所以我很难给出一个好的实施建议。