1

使用 RequestFactory 我获取数据以查看,然后在其他事务中其他人将此对象更新到版本 1(我的视图仍然是版本 0)。接下来我更新一些值并将 RequestFactory 的更改推送到 DAO 层。问题是当更改的对象被传输到服务层时:定位器调用 find 方法并获取最新版本的对象(由其他人更改)。因此,当我们在 DAO 层中更新方法时,对象将与 version1 合并,并从两个事务中更改!在这种情况下,正常情况下 Hibernate 应该抛出异常,因为对象应该有其他版本值(乐观锁)?

定位器:

@Component
public class TaskItemLocator extends Locator<TaskItem, Long> {     
   @Autowired
   private TaskItemDao taskItemDao;

   @Override
   public TaskItem find(Class<? extends TaskItem> aClass, Long id) {
     return taskItemDao.findTaskItem(id);
   }
}

道:

@Override
@Transactional(propagation = Propagation.REQUIRED)
public void updateTaskItems(List<TaskItem> taskItemToUpdate) {
        for (TaskItem ti : taskItemToUpdate) {
            getHibernateTemplate().update(ti);
        }
}

当我模拟这种情况而不在 RequestFactory 中调用 find 时,一切正常。当其他事务更改我的对象时引发异常。但是如何在 RequestFactory 中获得这种行为呢?除了在每次更新 RequestFactory 调用 find 方法之前,执行对 DB 的选择。接下来转到 DAO 层和休眠调用完全相同的选择查询,因为他检查对象版本。因此,对于每个更新的对象,一次选择是不必要的重复!!!

4

1 回答 1

1

RequestFactory 仅发送差异(即您在客户端更改的对象),因此它需要在调用您的服务方法之前将这些差异应用于服务器端的对象,这就是它需要查找对象的原因通过它的 ID。
此外,当您引用一个对象而不修改它时(例如,您将属性对象 A 设置为引用对象 B,对象 B 不会被修改),使用相同的 find() 方法;在这种情况下,您可能不希望出现乐观锁错误(即不可能将乐观锁检查烘焙到 find() 中)。
乐观锁定很难做好,因为你必须处理冲突(而且用户不想读“有人在你修改它时改变了它,所以我”

有关乐观锁定和 RequestFactory 的信息,请参阅http://code.google.com/p/google-web-toolkit/issues/detail?id=6046 。

于 2011-09-22T09:58:48.057 回答