2011-08-30 101 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