2011-08-30 53 views
2

我有一些類結構如下。這些類是hibernate類,所以我不能改變它們。Dozer將非泛型集合映射到屬性

//assume all getters & setters are present 
public class Order{ 
    private Customer customer; 
} 

public class Customer{ 
    // non generics set 
    private Set nameParts; 
} 

public class NamePart{ 
    private String id; 
    private String name; 
} 

// target class 
public class OrderShippingDetail{ 
    private String firstName; 
} 

mappying文件

<mapping> 
    <class-a>Order</class-a> 
    <class-b>OrderShippingDetail</class-b> 
    <field> 
     <a>customer.nameParts[0].name</a> 
     <b>firstName</b> 
    </field> 
</mapping> 

customer.nameParts這種映射[0] .NAME dosent工作作爲推土機dosent知道在該組中的對象。有沒有什麼解決辦法。

如果這隻能通過自定義轉換器完成,那麼可以使用示例代碼模板提示。

+0

所以你想第一個元素在集合nameParts映射指定的對象firstName?集合是無序的,所以nameParts中的第一個元素不會總是一樣的... –

+0

是的我知道,但最初的開發人員只留下一個只有一個元素的集合,那就是整個客戶名稱(不只是一個部分)。基本上我想訪問該集合中的任何一個元素。 – user918953

回答

0

我正在經歷的文檔,發現深映射在非泛型集合可以使用

<field> 
    <a>customer.nameParts[0].name</a> 
    <b>firstName</b> 
    <a-deep-index-hint>com.example.Customer, com.example.NamePart</a-deep-index-hint> 
</field> 
0

深入一層。像這樣

<mapping> 
    <class-a>Order</class-a> 
    <class-b>OrderShippingDetail</class-b> 
    <field> 
     <a>customer.nameParts[0]</a> 
     <b>this</b> 
    </field> 
</mapping> 

<mapping> 
    <class-a>{class of object @ nameparts[0]}</class> 
    <class-b>OrderShippingDetail</class-b> 
    <field><a>name</a><b>firstname</b></field> 
</mapping> 

這可以作爲解決方法。我使用這個技巧使它在某些地方工作。

+0

我不知道** 這個 **在映射期間做了什麼。你能解釋一下嗎? – user918953