迷惑,求解--ORM实体于领域实体之间的关系

09-12-08 xiaoqianglinsen
              

背景:设计之道新手

前提:

问题:究竟如何处理领域模型实体和ORM实体之间的关系

简介:(1):不管怎么样ORM的便利性是一种趋势,DDD中使用ORM貌似非常常见,那么如何处理DDD领域模型实体和ORM实体之间的关系呢?

(2):来个实例:需求:需要维护一批产品,能够即时的列出某一类产品的数量,价格之类的.那么根据这个需求,我们分析:领域对象:(1):产品(2):产品类别 那么在先是产品的时候肯定需要列出产品的类别名称.我如何处理这种情况.

              

banq
2009-12-08 17:21

>领域模型实体和ORM实体之间的关系呢

首先搞清楚先来后到,注意,这个先来后到不是大家接受的先来后到,大家可能先听到ORM Hibernate,现在才知道领域模型实体。

而在软件中,领域模型实体是直接来自需求,这个领域模型实体是否需要保存持久到硬盘不丢失,是技术因素,所以,领域模型是先,而ORM的实体是后。

DDD也对是否选用ORM也提出指导意见,在当前NoSQL运动背景下,我们可以根据CAP定律和BASE思想,对ORM也可以选择,用或不用,JPA是JavaEE 6的核心,所以,我们对所谓JAVA EE也是有选择权的。

>先是产品的时候肯定需要列出产品的类别名称

建立产品实体和类别的高聚合关联,在代码实现上,就是产品中有一个字段属性引用了类别,但产品显示时,可以通过getCategory获得其类别,然后显示类别名称。

如果类别相当多,可以直接向Repository查询获得。

xiaoqianglinsen
2009-12-09 00:10

首先对BANQ的指点表示衷心的感谢.

>但产品显示时,可以通过getCategory获得其类别,然后显示类别名称。

不过首先我是.NET阵营的,所以对JPA也就陌生至极了... 笨笨的sorry一下.

-----------------------------------------

针对这个问题,我觉得getCategory性能是个问题哦(如果我列出100条数据的话就要getCategory 100次,那这样性能是个问题 -- 如果不缓存的话,意味着要查100次数据库,还好我们的ORM多数都是有缓存的.)而且banq的前提条件是类别不多.

-----------------------------------------

>如果类别相当多,可以直接向Repository查询获得。

-----------------------------------------

根据DDD的理论,我所谓的ProductCategory应该是个领域对象了,那么如何处理这种领域对象之间的关系?还拿简单的显示来说,ORM返回的是一个有关联关系的Product并可以通过其Category的关联属性来获取到关联的ProductCategory对象.那么我如何通过ORM返回的对象来构造我们的领域对象.

又如何显示产品信息呢(包括显示产品类别) 我的意思是:是不是需要有个中间的东西(DTO?)来把领域对象转化为一个贫血的对象(只包含值),然后其他层(UI,Repository之类)接受这个贫血对象并进行呈现,或者保存到数据库.

------------------------------------------

再次感谢BANQ

banq
2009-12-09 09:40

2009年12月09日 00:10 "xiaoqianglinsen"的内容
我的意思是:是不是需要有个中间的东西(DTO?)来把领域对象转化为一个贫血的对象(只包含值),然后其他层(UI,Repository之类)接受这个贫血对象并进行呈现,或者保存到数据库.

呵呵,这个DDD没有具体规定,我个人实践是:不做DTO或所谓VO,对象太多,增加复杂性,一旦领域对象一变,修改面辐射大,在Jdon框架中,就直接由领域对象提将自己交给UI或Repository。

当然,你可以在领域对象中做一个方法,将自己的一部分属性或值打包成值对象交给UI和Respository。

我个人认为:ORM在DDD实践中非常碍手碍脚,设计一个模型有三个因素需要考虑:模型是否符合需求?模型是否符合ORM机制?模型是否能真正通过ORM实现数据库保存?

这三个问题足够让任何一个聪明人精神崩溃,所以,受Domain Events启示,将Domain层和技术架构彻底分离,也就是将模型和ORM 持久机制等彻底分离。

如果使用Neo4j这样内存KVS比ORM要降低开发难度,就不要考虑模型需要讲究ORM机制,也不用考虑是否持久等等底层问题,大大降低负担。

NEO4J 独特的NoSQL graph数据库

所以,Qi4j这样DDD框架直接使用NEO4j替代ORM作为持久层,这是一个革命性跳跃,是我们摆脱关系数据库的中世纪黑暗的一个跳跃。

忘记Scala,Qi4J是下一个 Java?

xiaoqianglinsen
2009-12-10 10:52

感觉NOSQL之类的距离一般常用的项目还有一段距离...

现在多为企业开发,企业开发有很多操作都需要事务支持.客户需要的是更加安全,更加可靠,多等两秒钟他们不介意.

2Go 1 2 下一页