具有某个子级及其子级的父实体对象可能会更改父对象状态,为防止出现并发问题,有一个很好的解决方案,名称为:乐观锁定
来自Vlad Mihalcea博客的和this好文章解决了所有主要问题,您不必担心来自父和子操作的管理版本字段以增加版本。
但问题在于:我可以想象作为父对象的对象依赖于大约4个子对象,并且这些子对象中的一些对象在数据库端执行它们的操作。 在数据库端对版本字段进行更新操作是否合乎逻辑?或者它不是我怎么能解决这个问题?解决方案是什么?
我的一些代码示例在这里:
@Transactional
public Long save(Long entityId) {
Parent parent= iParentService.loadByEntityId(entityId);
parent.setStatus(0)// known as first regstration
iParentService.persist(parent);
}
在应用程序端的子程序保存操作中的可能会更改并更新父项:
@Transactional
public Long save(Long childId) {
Child child= iChildService.loadByEntityId(childId);
Parent parent = child.getParent();
parent.setStatus(1)// save complete
iParentService.persist(parent);
iChildService.persist(child);
}
并且数据库端的确认操作在Oracle过程中,并从应用程序数据访问层调用它,如下所示:
Query query = session.createSQLQuery("{call DBPK_PARENT.CONFIRM(:parentId,:userId,:userIp)} ");
query.setParameter("parentId", parentId);
query.setParameter("userId", userId);
query.setParameter("userIp", userIp);
query.executeUpdate();
并在它的最后运行一个更新父实体状态的sql命令:
update Parent p
set p.status=2 -- known as confirm status
where p.id=parentId;