[英]DDD When should I create a domain object and a persistence object instead of using a persistence object as a domain object?
当我对领域驱动设计的理解工作时,我发现我有一个似乎有效的规则,虽然我想看看它是否过度,并且还希望看到相同情况的其他观点。
我的问题是:“域模型和持久性模型应该何时包含在单独的对象中?” 我现在选择的语言是Java,我正在使用Spring Data的存储库模型。
我看到了我的问题的三个主要答案。
为了询问有关DDD的问题,我发现我必须使用示例有界上下文,因为我还不太了解DDD以更抽象的方式提问。
这是我的说明性有限背景:说我有一个法律编纂系统,其中包含以下业务规则:
为了将这个有界的上下文表达为持久性模型,我有以下内容:
table: codification
fields: chart_code, prefix, coassign, codification_category
table: codification_chart
fields: chart_code, jurisdiction_description
table: codification_category
fields: category, low_category_number, high_category_number, description
table: global_codification
fields: prefix, coassign, codification_category
我知道,我应该首先从域模型开始。 我有一个持久性模型和一个域模型
在我的域模型中,我有三个域对象
public Codification {
private String prefix, coassign;
codificationCategory codificationCaegory; // an enum type
public Codification(...) { // set private vars }
// getters for private variables
}
public CodificationChart {
private List<Codification> chartCodifications = new ArrayList<>();
private String chartCode;
// public constructor to initialize private variables
// getters for private variables
public Codification addCodificationToChart(Codification){...}
public void removeCodificationFromChart(Codification){...}
public boolean checkCodificationInChart(Codification){...}
}
public enum CodificationCategory {
CIVIL, CRIMINAL, PROPERTY, CORPORATE, FAMILY, CONSUMER, ETHICS, BANKRUPTCY;
}
ORM对象:
JPA Mappings of the tables mentioned earlier with the "Entity" suffix added to their table names.
They are omitted for brevity.
Each one contains getters and setters like JPA Pojos do.
If someone asks for the Persistence objects code I will post it.
我的域对象知道持久性模型的唯一一点是在我的工厂对象CodificationChartFactory
,它具有我用来与前面提到的ORM对象交互的存储库接口。 此工厂是使用持久性存储库的域的唯一部分,因此是与持久性层交互的唯一部分。
在这里创建一个单独的域模型是浪费精力吗? 我可以看到如何将我的CodificationChart行为放在Persistence对象上。 将这些行为放在持久性对象上只是某种方式感觉是错误的,唯一的工作就是从数据库中检索记录。
我肯定会被纠正。
两种方法都是正确的,从设计的角度来看是一种品味问题。 有些人不希望他们的域对象与持久性有任何关系,并且创建一个额外的Entity
对象层...有些人不认为这是一个主要问题,并且很乐意继续使用域对象作为持久性对象。
就个人(和主观)而言,我认为使用JPA并拥有额外的Entity对象层是错误的方法。 像Hibernate这样的ORM的目标是成为Object和Relational模型之间的桥梁(我知道它在名称中:)。 我认为一种更好的方法,在一个人想要保持分离的情况下,是使用类似mybatis或纯SQL的东西,但绝对不是JPA ...否则它只是为了复杂性而增加复杂性(JPA不是最简单的学习框架)
我很高兴能够使用混合并注释我的域对象。 据我所知,它使持久性更容易管理...但与此同时,我觉得Hibernate / JPA非常舒服,并且已经使用了10年:)。
3年前我有一个非常类似的问题,我发布在程序员网站上 - ORM是否可以创建丰富的域模型?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.