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