在我参与的一个DDD项目中,我们正在寻找一些方便的解决方案来映射entity objects,domain objects反之亦然。
该项目的开发人员同意将领域模型与数据模型完全解耦。数据层使用JPA (Hibernate)持久化技术。
正如我们都认为持久性是 DDD 中的一个实现细节,从开发人员的角度来看,我们都在应用程序的各个方面寻找最合适的解决方案。
我们最关心的是aggregate,包含 列表的何时entities映射到JPA entity包含one-to-many关系的 。
看一下下面的例子:
public class Product extends Aggregate {
private ProductId productId;
private Set<ProductBacklogItem> backlogItems;
// constructor & methods omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
public class ProductBacklogItem extends DomainEntity {
private BacklogItemId backlogItemId;
private int ordering;
private ProductId productId;
// constructor & methods omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
public class ProductJpaEntity { …Run Code Online (Sandbox Code Playgroud) 根据DDD,有些类是实体,有些类具有@javax.persistence.Entity注释。他们应该是同一班吗?还是JPA实体应仅充当映射器(https://martinfowler.com/eaaCatalog/dataMapper.html)从数据库加载DDD实体(并将其存储)并保留在域模型之外的机制?
如果将数据库元数据分离并存储在外部(例如,以XML格式),会有所不同吗?如果此类是实体,边界在哪里?我认为从XSD(例如,使用JAXB)甚至使用MyBatis Generator从数据库生成的类都不是DDD中所理解的实体。