使用 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 层和休眠调用完全相同的选择查询,因为他检查对象版本。因此,对于每个更新的对象,一次选择是不必要的重复!!!