使用RequestFactory我将数据提供给View,然后在其他事务中将其他人更新为此对象的版本1(我的视图仍然是版本0)。接下来,我更新一些值并将RequestFactory的更改推送到DAO Layer。问题是当更改的对象转移到服务层时:Locator调用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);
}
}
DAO:
@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层并且hibernate调用exacly相同的select查询,因为他检查对象版本。因此,对于每个更新的对象,一个选择是不重复的!
答案 0 :(得分:1)
RequestFactory只发送差异(即你在客户端对象上发生的变化),因此在调用服务方法之前需要将这些差异应用于服务器端的对象,这就是它需要的原因。通过ID找到对象
此外,当您引用一个对象而不修改它时(例如,您将属性对象A设置为引用对象B,对象B未被修改),则使用相同的find()方法;在这种情况下,您可能不希望出现乐观的锁定错误(即不能将乐观锁定检查放入find())。
乐观锁定很难做得很好,因为你必须处理冲突(并且用户不想阅读“有人在你修改它时改变了这个东西,所以我要废弃你的改变并开始你从最新版本“)。
请参阅http://code.google.com/p/google-web-toolkit/issues/detail?id=6046关于乐观锁定和RequestFactory。