0

我正在通过 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,在这种情况下,我想将其作为新的 Vendor 对象持久保存。

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

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

4

1 回答 1

0

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

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

于 2012-03-19T18:51:22.367 回答