【问题标题】:Spring JSON merge春季 JSON 合并
【发布时间】:2011-12-21 15:53:20
【问题描述】:

我正在通过 AJAX 从表单更新记录。我有一个映射到我的实体的 JSON 对象,我的控制器方法是:

@RequestMapping(value = "/vendors", method = RequestMethod.POST)
public ResponseEntity<String> saveVendorsJson(@RequestParam String vendor) {
    Vendor v = Vendor.fromJsonToVendor(vendor);

    if (v.merge() == null) {
        v.persist();
    }
    return new ResponseEntity<String>(HttpStatus.OK);
}

我从文档中预计,如果 v.merge() 没有通过对象的“id”字段找到要合并的现有记录,它会返回 null,在这种情况下,我想将其作为新供应商保留对象。

发生的情况是,尽管我的 JSON 具有与现有记录匹配的“id”字段值,但我总是在浏览器中插入带有更新商品的新记录。

我知道我在这里使用 POST 方法 pull 双重职责,这不是严格的 RESTful。理论上,这对我来说更简单(当然事实并非如此)。

【问题讨论】:

  • 我假设Vendor 是一个自定义类,它扩展了实现.merge().persist() 的东西?您提到的实现类和“文档”是什么?如果您在上面所说的内容准确,一切看起来都正确并且应该可以工作。
  • Vendor 是一个 POJO,由 Spring-Roo 注释 @RooEntity 建模,这是其 persist() 方法的来源。
  • 我正在使用的文档是here,搜索字符串“merge”。
  • 您是否验证了v.fromJsonToVendor(vendor) 方法之后与您的JSON 字符串具有相同的ID?会不会是这个方法没有填充值,或者没有正确填充?
  • @BeauGrantham - 好建议...而且 id 肯定会从 JSON 中正确填充。

标签: spring spring-roo spring-json


【解决方案1】:

我相信这是 Hibernate 的事情。如果 Hibernate 不知道它已经存在,它就不会“合并”。我认为我过去所做的是进行查找,然后坚持。我认为,如果您尝试仅合并来自网络的某些东西,您会得到主键冲突或类似的东西。我相信 Hibernate 内部有某种“脏”标志来指示您是否正在创建或编辑现有对象。

在 raw-Hibernate 中也曾经有一种方式来做软查找,基本上告诉 Hibernate “看,我有这个对象,我不想做 SELECT blah-blah-blah,我只是想要更新一些字段”。它会将对象加载到缓存中,并允许您在不先执行 SELECT 的情况下进行更新。 Spring 中还有一个 updateOrSave(),但实际上是先执行 SELECT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多