2015-09-03 30 views
1

我有一個由jpa工具創建的實體,當我從DB獲取實體並嘗試使用推土機進行映射時,我有類似的DTO。Dozer copy-by-reference無法正常工作

實體和DTO的樣子

class A        class A1 
     {         { 
      private B b;      private B1 b1; 
      private C c;      private C1 c; 

      getter/setter      getter/setter 
     } 

     class B        class B1 
     {         {     
      private C c;      private C1 c; 

      getter/setter      getter/setter 
     }         } 

     class C        class C1 
     {         {   
      private A a;     private A1 a; 
      private B b;     private B1 b; 

      getter/setter     getter/setter 
     }         } 

推土機映射文件的樣子:

<mapping> 
     <class-a>com.entity.A</class-a> 
     <class-b>com.dto.A1</class-b>   
      <field copy-by-reference="true"> 
      <a>b</a> 
      <b>b1</b> 
      </field> 
      <field copy-by-reference="true"> 
      <a>c</a> 
      <b>c1</b> 
      </field> 
     </mapping> 

和我得到的異常,如:

org.dozer.MappingException: Illegal object type for the method 'setb1'. 
Expected types: 
com.dto.B1 
Actual types: 
com.entity.B 

我是很新的推土機,請幫我解決這個問題

+0

這個例外幾乎說明了一切。你可能在A1中有一個setter,它可以解除B參數而不是B1。 – Koby

+0

是的,但如何將對象類型b複製到b1,我需要一些建議來解決 –

+0

當使用copy-by-reference時,它們應該是相同的類型。使用這意味着Dozer不進行轉換/轉換,只是同一個對象的簡單副本。這是微調性能並避免創建對象的一種方法。你的用例是什麼?爲什麼你需要通過引用來複制? – Koby

回答

0

使用通過引用進行復制時,兩個實體上的setter應該是相同的類型。這意味着Dozer不會進行轉換/轉換,只是同一個對象的簡單副本。

如果您不需要此功能,請刪除「通過引用複製」屬性,它應該可以工作(假設您沒有任何其他複雜類型的Dozer無法自動轉換)。