Java 如何深度复制实体(不包括其关系的id)?
我将Spring与Spring数据JPA一起使用,在深度复制复杂实体时遇到了一个问题。实体A有10个一对多关系。为了简洁起见,这里只显示了一个。我想深度复制这个实体,而不包含嵌套对象B的id字段 我希望避免由于性能损失而使用反射。使用Orika,我设法排除了一个对象的id,但未能排除嵌套对象的idJava 如何深度复制实体(不包括其关系的id)?,java,spring,hibernate,orika,Java,Spring,Hibernate,Orika,我将Spring与Spring数据JPA一起使用,在深度复制复杂实体时遇到了一个问题。实体A有10个一对多关系。为了简洁起见,这里只显示了一个。我想深度复制这个实体,而不包含嵌套对象B的id字段 我希望避免由于性能损失而使用反射。使用Orika,我设法排除了一个对象的id,但未能排除嵌套对象的id @Entity public class A { @Id @GeneratedValue private Long id; //... @OneToMany
@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
}
如何实现我的目标?
注意-我没有锁定到Orika,欢迎使用任何其他解决方案。我已通过for Orika mapper并覆盖其默认方法解决了此问题。 现在,当使用映射器复制容器类时,包含Id注释的每个字段都被排除在外—它会影响所有嵌套的单个和多个发生元素 要使映射器使用自定义类映射生成器,请执行以下操作:
“由于性能损失,我想避免使用反射”,您使用spring、hibernate。。。这是反射。使用spring util或apache,如果您不想直接使用反射,您可以这样做如果您真的关心反射的性能,那么您就不会使用spring、Hibernate或Orika,因为它们所做的一切都100%依赖反射。
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);
MapperFactory mapperFactory = new DefaultMapperFactory
.Builder()
.classMapBuilderFactory(new IdExclusionClassMapBuilder.Factory())
.build();