如何深度复制一个实体,不包括它的关系的 id?

How to deep copy an entity excluding id's of it's relations?

我正在使用 Spring 和 Spring Data JPA,我在深度复制复杂实体时遇到了问题。实体 A 有 10 个一对多关系(为简洁起见,这里只显示一个),我想在没有嵌套对象 B.[=19= 的 id 字段的情况下深度复制这个实体]

由于性能损失,我想避免使用反射。使用 Orika,我设法排除了 A 的 ID,但未能排除嵌套对象的 ID。

@Entity
public class A {

    @Id
    @GeneratedValue
    private Long id;
    //...

    @OneToMany()
    @JoinColumn(name = "a_id")
    private Set<B> items;

    // getters and setters
}

@Entity
public class B {

    @Id
    @GeneratedValue
    private Long id;
    //...

    public B() {}

    // getters and setters
}

如您所见,我已尝试通过注册自定义 MapperFactory 来排除 B 的 ID,但它没有按预期工作。只有 A 的 ID 被排除,但集合 items 的元素仍然有它们的 ID。

A source = fetchFromDb();
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        mapperFactory.classMap(A.class, A.class)
                .mapNulls(true)
                .exclude("id")
                .exclude("items['id']")
                .byDefault()
                .register();
        MapperFacade mapperFacade = mapperFactory.getMapperFacade();

        A dest = mapperFacade.map(source, A.class);

如何实现我的目标? 注意 - 我不局限于 Orika,欢迎任何其他解决方案。

我已经通过 implementing a custom ClassMapBuilder 为 Orika 映射器解决了这个问题并覆盖了它的 byDefault() 方法。 现在,当映射器用于复制容器 class 时,每个具有 Id 注释的字段都被排除在外 - 它会影响所有嵌套的单次和多次出现元素。

使映射器使用自定义 ClassMapBuilder:

  MapperFactory mapperFactory = new DefaultMapperFactory
            .Builder()
            .classMapBuilderFactory(new IdExclusionClassMapBuilder.Factory())
            .build();