如何深度复制一个实体,不包括它的关系的 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();
我正在使用 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();