【发布时间】: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