4

在我的 crud 控制器中,在更新操作期间发生了以下情况

客户端向“POST /{id}”发出请求,并在请求正文中向我发送 DTO。然后我调用 ModelMapper 将 DTO 转换为数据库实体。之后,我将实体的 Id 字段设置为发送给我的一个客户。我做了一个存储库保存。

这失败了(创建一个全新的实体而不是更新),因为我试图手动设置一个自动生成的字段。JPA EntityManager 有一个合并方法,但我不确定它是否符合我的要求。

因此,我将代码更改为:首先获取具有请求 id 的实体,然后要求 ModelMapper 覆盖其字段,最后保存存储库。但是我不能让 ModelMapper 更新现有对象而不是构造一个新实例。根据文档,它看起来是可能的,但是我在 Providers 和 TypeMaps 之间迷路了。

所以我想要的是说服 JPA 使用瞬态实体进行更新,或者说服 ModelMapper 设置现有(和 jpa 附加)实体的字段。

一个简单的任务变得如此复杂的事实让我怀疑我在做一些根本错误的事情。你能建议我一个解决方案吗?

4

1 回答 1

0

您在寻找跳过吗?

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
}
于 2016-02-01T10:39:19.540 回答