【问题标题】:DAO design to update an entity in DBDAO 设计用于更新数据库中的实体
【发布时间】:2020-08-04 15:48:41
【问题描述】:

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

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

我应该进行两次数据库调用吗?

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

【问题讨论】:

  • 差不多,是的。一次调用获取(旧对象),一次调用更新对象。如果实体仍附加在 DAO 层中(即事务仍处于打开状态),则无需持久化即可获取和修改对象。当事务关闭时,更改将自动保留(当然,这使用数据库查询)。
  • 谢谢@Turing85

标签: java design-patterns dao


【解决方案1】:

避免两次数据库调用的唯一方法是使用更新语句仅更新您拥有的字段。例如

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:您应该引发异常来回滚事务。

【讨论】:

  • 取决于您的用例。通常我会建议加载实体并更新它。就像 Turing85 在他的评论中所说的那样。但是如果你想在一个批处理过程中更新很多实体,使用更新语句可能会更好。
猜你喜欢
  • 2017-04-15
  • 2011-08-09
  • 2015-04-18
  • 2012-07-29
  • 2021-12-11
  • 1970-01-01
  • 2018-09-05
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多