Java DAO设计策略应该如何用于更新操作?
我自己也很惊讶这个问题以前从未出现过,但这次我很烦恼,因为我正在创建自己的应用程序 我有一个TaskDetail类,它有30个字段。更新时,TaskDetail中只有一小部分可以像任务的“结束日期”一样更新。我们可以使用两种策略来更新此字段Java DAO设计策略应该如何用于更新操作?,java,design-patterns,Java,Design Patterns,我自己也很惊讶这个问题以前从未出现过,但这次我很烦恼,因为我正在创建自己的应用程序 我有一个TaskDetail类,它有30个字段。更新时,TaskDetail中只有一小部分可以像任务的“结束日期”一样更新。我们可以使用两种策略来更新此字段 方法1:使用所有30个字段更新整个对象,并使用相同的值覆盖数据库中的其余字段,更改后的字段将使用新值更新。 或 方法2:只更新已更改的字段。在这种情况下,我们会将Employee视为DTO,只使用新值填充“endDate”字段,因为它是唯一需要更改的字段
- 方法1:使用所有30个字段更新整个对象,并使用相同的值覆盖数据库中的其余字段,更改后的字段将使用新值更新。 或
- 方法2:只更新已更改的字段。在这种情况下,我们会将Employee视为DTO,只使用新值填充“endDate”字段,因为它是唯一需要更改的字段
以下哪种方法是公认的方法,还是第三种方法?我不太赞成使用hibernate,尽管我更喜欢SpringJDBC模板 仅按信息要点—方法1显然是一种性能开销,因为每次更新都要更新所有29个字段。您可以根据更新的字段进行更多的更新操作,但这将更多地基于您的用例。与DAO相比,我更担心的是性能、可维护性和原子性,只要DAO编写不复杂。为什么不使用hibernate?这个完全相同的问题是hibernate帮助您避免的。它将在内部自己进行检查,只更新数据库中已更改的字段,而不必对其他字段进行修改。使用hibernate不可行还是您不喜欢hibernate?为什么DAO接口中没有方法updateField(长记录ID,字符串newValue)?如果您选择hibernate路径,您必须启用dynamicUpdate以获得方法2,因为hibernate默认更新所有字段(这对大多数人来说是一个惊喜).我确实觉得hibernate在这种情况下很好,但出于某些原因,我不太喜欢hibernate a)需要对数据库进行高度规范化。使用基于hibernate的DAO,您必须设计DB以适应DAO,而不是编写DAO以适应DB。b) Hibernate维护自己的对象会话,这就像我希望使用外部会话管理(如terracota/coherence)一样,扰乱了自定义会话管理策略。terracota和hibernate没有必要为相同的对象维护会话。c) oracle、MySQL有许多强大的功能,不容易与hibernate一起使用。@Leo-将DAO的粒度转换为字段级别不是一个好主意,这就像每次添加新字段都会导致维护混乱一样。我并不反对你说的话,但我亲眼目睹过过过多的空检查会造成维护问题,如果你忘记添加空检查,结果也会很糟糕。不需要的字段被更新为null。我不确定我是否听起来很清楚。我是说如果你有两个文件中的一个要更新,你不应该使用方法1。