java - 使 JPA 和 ModelMapper 在实体更新中工作

标签 java hibernate jpa crud modelmapper

在我的 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/

相关文章:

java - 设计一个具有延迟加载特性的 Java POJO

java - isEventDispatchThread 超出 EDT 但从 EventDispatchThread.run 运行

java - 一对多关系不同的选项

java - WebLogic 10.3 部署错误(WebApp 3.0/Spring 4 MVC/Hibernate 应用程序)

java - Hibernate 是更新而不是插入,为什么?

java - JPA:如何使用 OneToMany 注释将新项目添加到列表中

java - 为什么 2.1.0 版本的 playframework 测试失败?

java - 无法将 String 解析为 Date 对象

java - 当我想使用find()方法两次时,我可以使用flush()而不是commit()吗?

java - Hibernate 生成预定义的实体标识符