英文:
DAO design to update an entity in DB
问题
客户端更新实体(例如:学生实体)的情况下,我们会获取学生的ID以及客户端修改过的其他字段(不是所有字段)。
我了解到我们应该将特定的实体对象传递给DAO以进行更新。
但是,我将如何获取该实体对象呢?因为我没有所有字段的数据来创建正确的实体对象。
我应该进行两次数据库调用吗?
第一次调用是为了构建正确的实体对象,然后通过将此更新后的实体对象传递给DAO来进行更新。
英文:
Lets say a client updates an entity ( Ex: student entity ).
So we get the student Id and other modified fields (not all fields) from the client.
I read that we should pass the particular entity object to DAO in order to update.
But then , how will I get to form that entity object.Because I don't have all fields data to create a proper entity object.
Should I make two DB calls ?
The first call is to construct a proper entity object and then make the update by passing this updated entity object to the DAO.
答案1
得分: 2
唯一避免进行两次数据库调用的方法是使用更新语句仅更新您拥有的字段。例如:
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
在执行executeUpdate之后,您应该检查受影响的行数:
- 1:一切正常
- 0:实体可能无法通过其id找到。也许它在此期间被删除,或者版本不匹配。在这两种情况下,您应该引发OptimisticLockException。
-
1:您应该引发异常以回滚事务。
英文:
The only way to avoid two DB calls is to use an update statement to update only th fields you have. E.g.
UPDATE Student SET someField1 = :field1, someField2 = :field2 WHERE ID = :id
Remember that update queries bypass optimistic locking checks.
If you use optimistic locking you should append the version to the where clause and also increment it.
UPDATE Student SET someField1 = :field1, version = version + 1 WHERE id = :id AND version = :version
After an executeUpdate you should check the affected rows:
- 1 : everything is ok
- 0 : the entity could either not be found by it's id. Maybe it was deleted in the meanwhile or the version did not match. In both cases you should raise an OptimisticLockException.
- >1 : you should raise an exception to rollback the transaction.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论