首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保hibernate版本号在javascript客户机中保持不变?

如何确保hibernate版本号在javascript客户机中保持不变?
EN

Stack Overflow用户
提问于 2015-04-30 17:14:03
回答 2查看 173关注 0票数 1

我有一个使用Java、Hibernate和im的Rest后端,使用version属性进行乐观锁定。对于并发控制,此版本属性必须转到客户端,然后再转到带有post请求的服务器。但是,在javascript客户机中,我失去了对该属性完整性的控制,例如:

  • 客户端"A“请求资源1。
  • 客户端"B“请求相同的资源。
  • 服务器向两个客户端(在各自的响应中)响应资源1版本1。
  • 客户端"A“修改资源并发布一个post来保存更改。
  • 服务器处理post请求和Hibernate检查版本号。1=1,因此修改了资源。
  • 客户机B处理javascript并将version属性修改为2并发出post请求。服务器处理post请求,现在处理2= 2,因此修改了资源并丢失了客户端A所做的更改。

记住,这是一个Rest后端,因此我无法在服务器中保存传递给每个用户的对象的版本号,等等。

因此,如果这是一个我认为是有效的问题,我如何确保该版本在客户端保持不变?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 17:31:20

就我个人而言,我会重新考虑这样做,因为我认为客户端这样做的动机很少,而且根据定义,您无法控制客户端发送给REST服务的内容。

但是,如果您确实有一个业务案例,那么一个半解决方案就是将version属性设置为GUID。这样,只有当您拥有最新的GUID (客户端B不具备这种GUID)时,才能提交,这使得版本控制的情况更加复杂,因为在请求成功之前,不能只增加1。

但是,即使在那里,您也不是完全安全的,因为客户机B理论上可以执行单独的请求,从资源中获取更新的GUID,然后使用更新的GUID重新提交失败的请求。

但是,既然客户B可以对更新版本进行编辑,以恢复客户端A所做的内容并添加它们自己的内容,这在本质上就是这样做的,而且由于他们有权这样做,我们又回到了自己的问题上,为什么我们要再次担心这种情况。

票数 1
EN

Stack Overflow用户

发布于 2015-04-30 17:23:59

使用一个构造函数来隐藏只读getter后面的数字:

代码语言:javascript
运行
复制
var MyObject = function(version) {
    var _version = version;

    this.getVersion = function() { return _version; }
}

或者,使用允许只设置一次变量的getter和setter对:

代码语言:javascript
运行
复制
var MyObject = function() {
    var self = this;

    var _tripwire = false;

    var _value = null;

    self.setValue = function(val) {
        if (_tripwire==false)
            _tripwire = true;
        else
            throw "Value is read-only";

        _value = val;
    };

    self.getValue = function() {
        return val;
    }
};

JSFiddle

取决于您希望它失败的方式,您可以用一个返回来替换抛出语句,该返回默默地吃掉属性集,但是对于API代码,当调用者做了一些非常不安全的事情时,最好大声而自豪地死去。

请注意,如果您更喜欢属性样式的访问方法,也可以使用属性访问器完成相同的设计模式:

代码语言:javascript
运行
复制
function setOnceProp(o, name) {
    var _value = null;

    var _tripwire = false;

    Object.defineProperty(o, name, {
        get: function() { 
            return _value; 
        },
        set: function(newValue) { 
            if (_tripwire==false)
                _tripwire = true;
            else
                throw "Value is read-only";

            _value = newValue; 
        },
        enumerable: true  
    });    
}

var MyObject = function() {
    var self = this;

    setOnceProp(self, 'value');    
};

这确实要求您的客户端使用相对较新的浏览器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29973919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档