Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate GWT RequestFactory在定位器中休眠不必要的调用查找方法_Hibernate_Spring_Gwt_Requestfactory - Fatal编程技术网

Hibernate GWT RequestFactory在定位器中休眠不必要的调用查找方法

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

使用RequestFactory,我获取要查看的数据,然后在其他事务中,其他人将此对象更新为版本1(我的视图仍然是版本0)。接下来,我更新一些值,并将RequestFactory的更改推送到DAO层。问题是当更改的对象被传输到服务层时:定位器调用find方法并获取对象的最新版本(由其他人更改)。所以,当我们开始更新DAO中的方法时,层对象与版本1合并,并从两个事务中进行更改!在这种情况下,在正常情况下,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);
   }
}
@组件
公共类TaskItemLocator扩展了定位器{
@自动连线
私有任务项DAO任务项DAO;
@凌驾

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


请参阅关于乐观锁定和RequestFactory。

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

请参阅关于乐观锁定和请求工厂

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