DDD(java)聚合根和持久性

时间:2012-02-24 20:46:24

标签: java domain-driven-design repository design-patterns unit-of-work

我正在创建一个应用程序,它将使用各种大小的表,而我已经开发了一个标记为DDD的项目,之前它没有真正使持久性部分正确,因此我还在研究事物。我没有完全掌握并且似乎找不到具体例子的一件事是如何坚持聚集根的“孩子”。我在没有ORM(只是普通的旧DAO)的情况下工作,很难找到这样的例子(这实际上是针对uni的项目,这是特定于db的,所以我'不允许'使用ORM,而我很欣赏这简直太容易了。我已经四处查看了stackoverflow的具体示例,但似乎并没有真正描述我的特定问题。

我怀疑下面的代码是对的

public DataTable getTableByID(int id) throws AccessException{
    DataTable result = this.context.TableContext().getEntityByID(id);
    result.setColumns(getColumnsByTableID(id));     
    return result;
}

private List<DataColumn> getColumnsByTableID(int id){
    Object[] arguments = { id };
    return this.context.ColumnContext().getUnitsWhere("TABLE_ID = ?", arguments);
}

如您所见,每次检索表实体时都会设置columns集合,如果表已经在内存中,这显然会丢弃已添加到集合中或从集合中删除的任何列。我不确定我应该在哪里或如何检索列(我考虑过从表类中调用存储库,但有些事情让人感到厌倦)。说到持久性,我也不完全确定如何去做,当我将对象添加到列表中时我可以轻松地检索它们但是当我删除它们时我真的没有检测方法(因为我是确保把事件赶上来这将是作弊:))。非常感谢正确的方向,谢谢。

1 个答案:

答案 0 :(得分:4)

DDD是一组与技术无关的指南。但是,域对象长期存在的项目(即生存进程重启)需要某种基础结构来处理持久性问题,如果使用关系数据库则需要ORM。在这种情况下,ORM是必须的,因为您需要将Domain模型尽可能地作为持久性不可知。您不希望持久性问题在您的域模型上“流血”。现在的问题是你是使用现有的ORM还是尝试构建自己的ORM。无论你是否意识到这一点,看起来你都在努力建立自己的自己。建立ORM是一项重大任务,也是自己的项目。我不确定期望一个人在合理的时间内构建ORM和应用程序本身是多么现实。无论如何,Martin Fowler有一套你可能想看的patterns

  

对象 - 关系行为模式:工作单元(184),身份   地图(195),懒惰负荷(200)

     

对象 - 关系结构模式:身份字段(216),外来   密钥映射(236),关联表映射(248),依赖映射   (262),嵌入值(268),序列化LOB(272),单表   继承(278),类表继承(285),具体表   继承(293),继承映射器(302)。

     

对象 - 关系元数据映射模式:元数据映射(306),   查询对象(316),存储库(322)。

针对您的具体问题,请查看Identity MapData Mapper。您还可以查看hibernate源代码的实现提示,但它可能有点压倒性。