首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Json对象更新Java (Ebean)对象

如何从Json对象更新Java (Ebean)对象
EN

Stack Overflow用户
提问于 2018-07-27 22:14:11
回答 2查看 636关注 0票数 0

我已经知道如何使用以下代码从Json创建对象:

代码语言:javascript
复制
SomeClass someObject  = Json.fromJson(someJsonNode, SomeClass.class);

我还知道如何对ebean对象执行save()update()操作。

我想要做的是,从JsonNode中的数据更新现有的object ,如下所示:

代码语言:javascript
复制
SomeClass someObject = fetchMyObjectFromDb();
someObject.updateFromJson(someJsonNode);

代码语言:javascript
复制
SomeClass someObject = fetchMyObjectFromDb();
Json.updateFromJson(someJsonNode,someObject);

在我的特定情况下,对象是一个Ebean实体,这可能会有所帮助,但我没有找到任何从Ebean到Ebean的帮助器方法。

我的Json.*工具与Google Gson非常相似,但我也找不到我想要的东西。

我是否必须使用Java reflexion自己编写代码,或者有没有更简单的方法/工具来做到这一点?

编辑:我也很高兴有一种简单的方法来更新一个Ebean实体的多个属性。我找不到一个简单的myEbeanObject.set("attributeName",value)形式的“集合”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-30 17:20:29

如果有人感兴趣,这里是我最终要做的事情。小实用程序方法,使用java反射从同一类的其他java对象更新java对象:

代码语言:javascript
复制
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public <T> void updateObjFromObj(T objToUpdate, T objToUse)
        throws IllegalAccessException {
    Class<?> clazz = objToUpdate.getClass();

    while (clazz != null) {
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                boolean accessible = field.isAccessible();
                field.setAccessible(true);
                if (field.get(objToUse) != null) {
                    field.set(objToUpdate, field.get(objToUse));
                }
                field.setAccessible(accessible);
            }
        }

        clazz = clazz.getSuperclass();
    }
}

仅当新值不为空时才更新字段。可以使用如下方式从Json更新ebean对象:

代码语言:javascript
复制
SomeClass someObjectToUpdate = fetchMyObjectFromDb();
SomeClass objectToUse  = Json.fromJson(someJsonNode, SomeClass.class);
updateObjFromObj(someObjectToUpdate, objectToUse);
someObjectToUpdate.save();

编辑/更新:如果您使用它来更新ebean对象,则需要使用setter和getter来将更改持久保存到数据库中。

因此,您可以在字段循环之前添加以下内容:

代码语言:javascript
复制
PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);

而不是:

代码语言:javascript
复制
field.set(objToUpdate, field.get(objToUse));

使用:

代码语言:javascript
复制
objToUpdateAccessor.setPropertyValue(field.getName(), field.get(objToUse));
票数 1
EN

Stack Overflow用户

发布于 2018-07-29 02:50:34

我想你的SomeClass扩展了ebean的Model,对吗?Modelsave() method。如果您对从数据库获取的对象调用save(),它将被更新,如果您对新对象调用它,它将被保存到数据库。

因此,您可以简单地调用save()方法。

如果你正在使用ebean和Play框架,你也可以通过update() method更新你的模型。

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

https://stackoverflow.com/questions/51559829

复制
相关文章

相似问题

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