gpt4 book ai didi

java - 如何深度复制一个实体(不包括其关系的 id)?

转载 作者:行者123 更新时间:2023-12-02 12:41:15 24 4
gpt4 key购买 nike

我将 Spring 与 Spring Data JPA 结合使用,在深度复制复杂实体时遇到了问题。实体 A 有 10 个一对多关系(为简洁起见,此处仅显示一个),我想深度复制该实体,而不包含嵌套对象 B 的 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() 方法。现在,当使用映射器复制容器类时,每个具有 Id 注释的字段都会被排除 - 它会影响所有嵌套的单次和多次出现元素。

要使映射器使用自定义ClassMapBuilder:

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

关于java - 如何深度复制一个实体(不包括其关系的 id)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44923431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com