在JPA2.1中更新一对多ArrayList

时间:2015-03-26 14:28:46

标签: java hibernate jpa orm eclipselink

{
    "id": 1,
    "name": "First-Search",
    "steps": [
        {
            "id": 1,
            "subSearchId": 1,
            "step": 1
        },
        {
            "id": 3,
            "subSearchId": 1,
            "step": 2
        },
        {
            "id": 2,
            "subSearchId": 1,
            "step": 3                
        }
    ]
}

在这个json中,我想更新 steps [] 数组元素步骤号。 如果我交换步骤值,他们也应该在db中更新,

条件

我的表格对 subSearchId 步骤

的组合有唯一的关键限制

我不想在更新前删除所有记录。

有没有更新此

的最佳方法

myController的

JsonNode json = request().body().asJson();
        final SubSearch t = Json.fromJson(json, SubSearch.class);
        SubSearchDao tdao = new SubSearchDao();
        SubSearchStepDao stdao = new SubSearchStepDao();
        SubSearch subSearch = tdao.findById(t.id);
        SubSearchStep sst = null;
        SubSearchStep sstTmp = null;
        boolean orderChanged = false;

//        orderChanged = subSearch.steps.stream().filter(p -> p.step != (t.steps.stream().filter(p1 -> p1.id!=null && p1.id.equals(p.id)).findFirst()).get().step).findFirst().isPresent();
        for (int i = 0; i < subSearch.steps.size(); i++) {
            sst = t.steps.get(i);
            sstTmp = subSearch.steps.get(i);
            if (sst.id != null) {
                // true, means steps has been updated
                if (sst.step != sstTmp.step) {
                    orderChanged = true;
//                    sst.id=null;
                }
            }
        }
        if (orderChanged) {
            stdao.deleteAll(subSearch);
            return ok(Json.toJson(tdao.update(t)));
        } else {
            return ok(Json.toJson(tdao.update(t)));
        }

现在我在更新前删除所有条目,如果我收到任何订单更改。

数据库:

      id  subSearchId    step  
------  -----------  --------
    1            1         1
    2            1         3
    3            1         2

我想要交换步骤并且( subSearchId步骤)是唯一的。

1 个答案:

答案 0 :(得分:0)

这听起来像是JPA无法处理的事情,因为没有办法安排更新语句以便它们不会失败。您需要将数据库设置为仅在事务完成时检查约束,而不是在语句级别检查。如果无法做到这一点,则需要删除约束或继续删除所有约束。