JPA,合并更新子项的对象

时间:2012-07-04 11:54:48

标签: oracle hibernate jpa playframework

我在父对象上有这个

@OneToMany(mappedBy="idUser", cascade = CascadeType.MERGE)
public List<Directions> directions;

在我的控制器中我得到了这个

public static void userUpdate(String apikey, JsonObject body) {
    if(validate(apikey)) {

        Long idUser = decode(apikey);
        User oldUser = User.findById(idUser);

        Map<String, User> userMap = new HashMap<String, User>();
        Type arrayListType = new TypeToken<Map<String, User>>(){}.getType();
        userMap = gson().fromJson(body, arrayListType);
        User user = userMap.get("user");

        oldUser.em().merge(user);

        oldUser.save();

    }else{
        forbidden();
    }
}

它在父对象上进行更新,但是当我在子对象上更改某些内容时,它不会更新它,也不会出现hibernate或Oracle的问题。

有谁知道它为什么不更新子对象?

全部谢谢!

更新了解决方案!

这就是我的工作方式,因为@JB Nizet说你也必须保存孩子的物品。

oldUser.em().merge(user); 
oldUser.save();

for (Direction direction : oldUser.directions) { 
    direction.save();          
}

另一个方法!

有了这个

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "SASHNBR", insertable = true, updatable = true)
public List<Direction> directions;

我已经能够生成oldUser.save()并保存子对象。

1 个答案:

答案 0 :(得分:1)

AFAIK,Play需要在所有修改过的实体上调用save()。所以你可能需要遍历用户的指示并保存它们:

for (Direction direction : user.getDirections()) {
    direction.save();
}