我怎样才能"补丁" JPA实体?

时间:2017-01-27 04:12:35

标签: java hibernate rest jpa

让我们假装RESTful服务收到PATCH请求,以更新可能包含数十个字段的实体的一个或多个字段。

@Entity
public class SomeEntity {

  @Id
  @GeneratedValue
  private Long id;

 // many other fields
}

修补相应实体的一种肮脏方式是编写如下内容:

SomeEntity patch = deserialize(json);
SomeEntity existing = findById(patch.getId());
if (existing != null) 
{
 if (patch.getField1() != null) 
 {
   existing.setField1(patch.getField1());
 }
 if (patch.getField2() != null) 
 {
   existing.setField2(patch.getField2());
 }
 if (patch.getField3() != null) 
 {
   existing.setField3(patch.getField3());
 }
}

但这太疯狂了!如果我想补丁1到很多&该实体的其他协会疯狂甚至可能变得危险!

是否有一种理智的方式来完成这项任务?

3 个答案:

答案 0 :(得分:0)

修改SomeEntity的getter并应用check,如果有任何值为空或null,则只返回相应的实体对象值。

class SomeEntity {
    transient SomeEntity existing;
    private String name;
    public String getName(){
        if((name!=null&&name.length()>0)||existing==null){
            return name;
        }
        return existing.getName();
    }
}

答案 1 :(得分:0)

您可以发送一个数组,其中包含您要修补的字段的名称。然后,在服务器端,通过反射或任何字段映射,将每个字段设置为实体。我已经实现了它并且它有效,我认为最好的建议是:

不要发布端点来执行"泛型" PATCH(修改),但是执行特定操作的。例如,如果要修改员工的地址,请发布端点,如:

PUT /employees/3/move

需要使用新地址{"address" : "new address"}的JSON。

答案 2 :(得分:0)

不是通过自己编写逻辑来重新发明轮子,为什么不使用像Dozer这样的映射库?你想使用' map-null'映射属性:http://dozer.sourceforge.net/documentation/exclude.html

编辑我不确定是否可以将类映射到自身。但是,你可以使用中间人DTO。