【问题标题】:DDD (java) Aggregate roots and persistenceDDD (java) 聚合根和持久性
【发布时间】:2012-02-24 20:46:23
【问题描述】:

我正在创建一个应用程序,该应用程序将使用各种大小的表,而我曾在一个标有 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);
}

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

【问题讨论】:

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


    【解决方案1】:

    DDD 是一组与技术无关的指南。然而,领域对象长期存在的项目(即进程重启后仍然存在)需要某种基础设施来处理持久性问题,如果您使用关系数据库,则需要 ORM。在这种情况下,ORM 是必须的,因为您需要您的域模型尽可能地与持久性无关。您不希望持久性问题在您的域模型上“流血”。现在的问题是您是使用现有的 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 源代码以获取实现提示,但它可能有点让人不知所措。

    【讨论】:

    • 你说的很有道理,我认为构建一个完整的 ORM 有点多,因为这不是一个开始的大项目,虽然我知道它不完全是 ddd,您是否预见到仅进行 1-1 映射并让“存储库”(显然不是存储库)直接映射到数据库的任何问题? (基本上只是美化道)
    • 我认为这种方法可行,但很难称其为“域驱动”,它将是数据驱动的。
    • 没错,我不会称它为 ddd,但如果它阻止我滚动自己的 orm,我会接受它。老实说,我只是在寻找一种体面的方式来进行数据库访问,从我读到的关于活动记录的内容来看,这对于我们的目的来说似乎有点过于严格。正如我所说,我之前从事过半 ddd 项目,并且喜欢根据问题对域进行建模的方式,但对于这个项目来说,似乎工作量太大而收益太少。再次感谢所有帮助,我真的很感激。
    • 对于它的价值,在 .NET 世界的“微 ORM”领域有很多变化。应该有java替代品:stackoverflow.com/questions/6494938/java-micro-orm-equivalent
    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 2011-02-07
    • 2020-03-20
    • 2018-08-12
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多