Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DAO设计策略应该如何用于更新操作?_Java_Design Patterns - Fatal编程技术网

Java DAO设计策略应该如何用于更新操作?

Java DAO设计策略应该如何用于更新操作?,java,design-patterns,Java,Design Patterns,我自己也很惊讶这个问题以前从未出现过,但这次我很烦恼,因为我正在创建自己的应用程序 我有一个TaskDetail类,它有30个字段。更新时,TaskDetail中只有一小部分可以像任务的“结束日期”一样更新。我们可以使用两种策略来更新此字段 方法1:使用所有30个字段更新整个对象,并使用相同的值覆盖数据库中的其余字段,更改后的字段将使用新值更新。 或 方法2:只更新已更改的字段。在这种情况下,我们会将Employee视为DTO,只使用新值填充“endDate”字段,因为它是唯一需要更改的字段

我自己也很惊讶这个问题以前从未出现过,但这次我很烦恼,因为我正在创建自己的应用程序

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

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

方法1:(优点)-这是一种更干净的方法。 (缺点)-为了一个字段,我们不必要地多写了29个字段

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

这个问题让我有点不舒服


以下哪种方法是公认的方法,还是第三种方法?我不太赞成使用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。