如何从 Json 对象更新 Java (Ebean) 对象
How to update a Java (Ebean) Object from a Json Object
我已经知道如何使用以下代码从 Json 创建对象 :
SomeClass someObject = Json.fromJson(someJsonNode, SomeClass.class);
我也知道如何 save()
和 update()
一个 ebean 对象。
我想做的是更新现有对象来自Json节点中的数据,一些东西看起来像这样:
SomeClass someObject = fetchMyObjectFromDb();
someObject.updateFromJson(someJsonNode);
或
SomeClass someObject = fetchMyObjectFromDb();
Json.updateFromJson(someJsonNode,someObject);
在我的特定情况下,该对象是一个 Ebean 实体,也许这会有所帮助,但我没有找到从 Ebean 到那个的任何辅助方法。
我的 Json.* 工具与 Google Gson 非常相似,但我也找不到我想要的东西。
我是否必须使用 Java 反思自己编写代码,或者是否有更简单的 way/tool 来做到这一点?
编辑:我也很高兴有一种简单的方法来更新 Ebean 实体的多个属性。我找不到 myEbeanObject.set("attributeName",value)
形式的简单 "set" ?
我想您的 SomeClass
扩展了 ebean 的 Model
,对吗? Model
有 save()
method。如果对从数据库中获取的对象调用 save()
,它将被更新,如果对新对象调用它,它将被保存到数据库中。
所以你可以简单地调用save()
方法。
如果您将 ebean 与 Play Framework 一起使用,您还可以通过 update()
method.
更新您的模型
如果有人感兴趣,这就是我最后所做的。小型实用方法,使用 java 反射从同一 class 的另一个 java 对象更新 java 对象:
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 对象
SomeClass someObjectToUpdate = fetchMyObjectFromDb();
SomeClass objectToUse = Json.fromJson(someJsonNode, SomeClass.class);
updateObjFromObj(someObjectToUpdate, objectToUse);
someObjectToUpdate.save();
Edit/Update :如果您使用它来更新 ebean 对象,则需要使用 setter 和 getter 将更改持久保存到数据库中。
因此您可以在字段循环之前添加:
PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);
然后代替:
field.set(objToUpdate, field.get(objToUse));
使用:
objToUpdateAccessor.setPropertyValue(field.getName(), field.get(objToUse));
我已经知道如何使用以下代码从 Json 创建对象 :
SomeClass someObject = Json.fromJson(someJsonNode, SomeClass.class);
我也知道如何 save()
和 update()
一个 ebean 对象。
我想做的是更新现有对象来自Json节点中的数据,一些东西看起来像这样:
SomeClass someObject = fetchMyObjectFromDb();
someObject.updateFromJson(someJsonNode);
或
SomeClass someObject = fetchMyObjectFromDb();
Json.updateFromJson(someJsonNode,someObject);
在我的特定情况下,该对象是一个 Ebean 实体,也许这会有所帮助,但我没有找到从 Ebean 到那个的任何辅助方法。
我的 Json.* 工具与 Google Gson 非常相似,但我也找不到我想要的东西。
我是否必须使用 Java 反思自己编写代码,或者是否有更简单的 way/tool 来做到这一点?
编辑:我也很高兴有一种简单的方法来更新 Ebean 实体的多个属性。我找不到 myEbeanObject.set("attributeName",value)
形式的简单 "set" ?
我想您的 SomeClass
扩展了 ebean 的 Model
,对吗? Model
有 save()
method。如果对从数据库中获取的对象调用 save()
,它将被更新,如果对新对象调用它,它将被保存到数据库中。
所以你可以简单地调用save()
方法。
如果您将 ebean 与 Play Framework 一起使用,您还可以通过 update()
method.
如果有人感兴趣,这就是我最后所做的。小型实用方法,使用 java 反射从同一 class 的另一个 java 对象更新 java 对象:
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 对象SomeClass someObjectToUpdate = fetchMyObjectFromDb();
SomeClass objectToUse = Json.fromJson(someJsonNode, SomeClass.class);
updateObjFromObj(someObjectToUpdate, objectToUse);
someObjectToUpdate.save();
Edit/Update :如果您使用它来更新 ebean 对象,则需要使用 setter 和 getter 将更改持久保存到数据库中。
因此您可以在字段循环之前添加:
PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);
然后代替:
field.set(objToUpdate, field.get(objToUse));
使用:
objToUpdateAccessor.setPropertyValue(field.getName(), field.get(objToUse));