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_Dao - Fatal编程技术网

Java DAO设计用于更新数据库中的实体

Java DAO设计用于更新数据库中的实体,java,design-patterns,dao,Java,Design Patterns,Dao,假设客户端更新一个实体(例如:学生实体)。 因此,我们从客户端获取学生Id和其他修改的字段(不是所有字段) 我读到我们应该将特定的实体对象传递给DAO以进行更新。 但是,我将如何形成那个实体对象呢?因为我没有所有的字段数据来创建一个合适的实体对象 我应该打两个DB电话吗? 第一个调用是构造一个适当的实体对象,然后通过将此更新的实体对象传递给DAO进行更新。避免两个DB调用的唯一方法是使用update语句只更新您拥有的字段。例如 UPDATE Student SET someField1 = :f

假设客户端更新一个实体(例如:学生实体)。 因此,我们从客户端获取学生Id和其他修改的字段(不是所有字段)

我读到我们应该将特定的实体对象传递给DAO以进行更新。 但是,我将如何形成那个实体对象呢?因为我没有所有的字段数据来创建一个合适的实体对象

我应该打两个DB电话吗?


第一个调用是构造一个适当的实体对象,然后通过将此更新的实体对象传递给DAO进行更新。

避免两个DB调用的唯一方法是使用update语句只更新您拥有的字段。例如

UPDATE Student SET someField1 = :field1, someField2 = :field2 WHERE ID = :id
请记住,更新查询绕过乐观锁定检查。 如果使用乐观锁定,则应将版本附加到where子句,并将其递增

UPDATE Student SET someField1 = :field1, version = version + 1 WHERE id = :id AND version = :version
执行更新后,应检查受影响的行:

  • 1:一切都好
  • 0:无法通过实体的id找到该实体。可能该实体已被删除,或者版本不匹配。在这两种情况下,您都应该提出OptimisticLockException
  • >1:您应该引发异常以回滚事务

  • 差不多,是的。一次调用获取(旧对象),一次调用更新对象。如果实体仍然附加在DAO层中(即事务仍然打开),那么在不持久化对象的情况下获取和修改对象就足够了。当事务关闭时,更改将自动保留(当然,这将使用db查询)。Thank you@Turing85取决于您的用例。通常我建议加载实体并更新它。就像图灵85在评论中说的那样。但是,如果您想在批处理过程中更新很多实体,那么最好使用update语句。