在我的 crud Controller 中,更新操作期间发生以下情况
客户端向“POST/{id}”发出请求,并在请求正文中向我发送一个 DTO。
然后我调用 ModelMapper 将 DTO 转换为数据库实体。
之后,我将实体的 Id 字段设置为客户端发送给我的一个。
我做了一个存储库保存。
这失败了(创建一个全新的实体而不是更新),因为我试图手动设置一个自动生成的字段。 JPA EntityManager 有一个合并方法,但我不确定它是否符合我的要求。
因此,我将代码更改为:首先获取具有请求 id 的实体,然后要求 ModelMapper 覆盖其字段,最后进行存储库保存。但是我不能让 ModelMapper 更新现有对象而不是构造一个新实例。根据文档看起来可能,但我在 Providers 和 TypeMaps 之间迷失了方向。
所以我想要的是说服 JPA 对 transient 实体进行更新,或者说服 ModelMapper 设置现有(和 jpa 附加)实体的字段。
一个简单的任务变得如此复杂这一事实让我怀疑我在做一些根本错误的事情。你能给我建议一个解决方案吗?
最佳答案
您在找 skip ?
public static void main(String[] args) {
ModelMapper mapper = new ModelMapper();
mapper.addMappings(new PropertyMap<B, A>() {
@Override
protected void configure() {
skip(destination.getId());
}
});
A a = new A(5, 15);
B b = new B(7, 17);
mapper.map(b, a);
System.out.println(a.id); // prints 5
System.out.println(a.x); // prints 17
}
static class A {
private int id;
private long x;
public A() {
}
public A(int id, long x) {
this.id = id;
this.x = x;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getX() {
return x;
}
public void setX(long x) {
this.x = x;
}
}
static class B {
// exact copy of A
}
关于java - 使 JPA 和 ModelMapper 在实体更新中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35128239/