【问题标题】:How should the DAO design strategy be for update operation ?DAO 设计策略应该如何进行更新操作?
【发布时间】:2014-02-06 13:24:18
【问题描述】:

我自己很惊讶,这个问题我以前从未想过,但这次我很困扰,因为我正在创建自己的应用程序。

我有一个包含 30 个字段的 TaskDetail 类。在更新时,可能只有一小部分 TaskDetail 可以更新,就像任务的“结束日期”一样。我们可以使用两种策略来更新这个字段。

  • 方法 1:用所有 30 个字段更新整个对象,并让数据库中的其余字段用相同的值覆盖,期望更改的字段将用新值更新。 或
  • 方法 2:仅更新已更改的字段。在这种情况下,我们会将 Employee 视为 DTO,并使用新值填充“endDate”字段,因为它是唯一需要更改的字段。

这两种方法似乎各有利弊

方法 1:(优点)- 这是一种更清洁的方法。 (缺点)- 我们不必要地为了一个字段而覆盖了 29 个附加字段。

方法 2 : (PROS) - 我们只是更新已修改的字段 (缺点)- 使 DAO 看起来很脏,因为我们需要 30 次空检查来确定必须更新哪些字段。

这个问题让我有点不舒服。

哪种方法是公认的方法,还是有第三种方法?尽管更喜欢 Spring JDBC 模板,但我不太赞成使用 hibernate。

【问题讨论】:

  • 为什么不使用休眠?这个完全相同的问题正是 hibernate 可以帮助您避免的问题。它会在内部自行进行检查并仅更新数据库中已更改的字段,而不会打扰其他字段。使用休眠是不可行的还是您只是不喜欢休眠?
  • 为什么在你的 DAO 接口中没有方法 updateField(long recordid, String newValue) ?
  • 如果你走Hibernate路线,你必须启用dynamicUpdate才能获得方法2,因为Hibernate默认更新所有字段(这对大多数人来说是一个惊喜)。
  • 我确实觉得在这种情况下休眠很好,但由于某些原因我不太喜欢休眠 a) 需要对数据库进行高度规范化。使用基于休眠的 DAO,您必须设计适合 DAO 的 DB,而不是编写适合 DB 的 DAO。 b) Hibernate 维护自己的对象会话,这就像我希望使用外部会话管理那样弄乱自定义会话管理策略。兵马俑/连贯性。没有意义 terracota 和 hibernate 都为相同的对象维护会话。 c)oracle,MySQL 有很多强大的功能,不方便与hibernate一起使用。
  • @Leo - 让 DAO 细化到字段级别并不是一个好主意,这就像每次添加新字段时都会让自己陷入维护浩劫。

标签: java design-patterns


【解决方案1】:

仅从信息要点来看 - 方法 1 显然是一种性能开销,因为每次更新都会更新所有 29 个字段。您可以根据您更新的字段进行更多更新操作,但它将更多地基于您的用例。与 DAO 的外观相比,只要它不复杂,我会更担心性能、可维护性和原子性。

【讨论】:

  • 我并不反对你所说的,但我亲眼目睹了过多的空检查如何产生维护问题,如果你忘记放一个也会产生糟糕的结果。不需要的字段被更新为 null。
  • 我不确定我是否听起来很清楚。我是说如果你有两个文件之一要更新,你不应该采用方法 1。
猜你喜欢
  • 2021-03-18
  • 2014-12-31
  • 1970-01-01
  • 2021-10-09
  • 2011-09-30
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多