2017-07-05 25 views
0

我正在使用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的編號被排除,但收集items的元素仍然有其編號。

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,歡迎任何其他解決方案。

+1

「我要避免使用引起的反射,性能損失」,你用spring,hibernate的...它的倒影。使用spring util或apache,如果你不想直接使用反射,你可以做到這一點 – xyz

+0

如果你真的關心*性能反射*你不會使用Spring或Hibernate或Orika,它們100%做。 –

回答

0

我設法解決了Orika mapper的implementing a custom ClassMapBuilder問題,並覆蓋了它的byDefault()方法。 現在使用映射器複製容器類時,將排除具有Id註釋的每個字段 - 它會影響所有嵌套的單個和多個發生元素。

爲了使映射使用自定義ClassMapBuilder

MapperFactory mapperFactory = new DefaultMapperFactory 
      .Builder() 
      .classMapBuilderFactory(new IdExclusionClassMapBuilder.Factory()) 
      .build(); 
相關問題