2011-04-13 176 views
2

假设我有以下类:集合映射

class A1 { 
    List<B1> bList; 
} 

class B1 { 
    Long id; 
} 

--- 

class A2 { 
    List<Long> bList; 
} 

我想A1级映射到A2与推土机,其中A1.bList包含B1对象和A2.bList只包含B1对象的ID。

映射的外观如何?

谢谢。

回答

0

我想你可以尝试设置LongB1的映射。如果我没有记错,这只有一种方法,我不记得是哪一种方式。对不起,希望这有助于。

+0

你能说明如何设置long和B1之间的映射关系吗? – 2012-05-31 05:44:48

0

您可以使用推土机自定义转换器。 Dozer customer converter

一个例子:(可能出现的错误,没有编译或测试)

<mapping> 
    <class-a>A1</class-a> 
    <class-b>A2</class-b>  
    <field custom-converter="converters.YourCustomConverter"> 
    <a>bList</a> 
    <b>bList</b> 
    </field> 
</mapping> 

定制转换器:

public class YourCustomConverter implements CustomConverter { 

    public Object convert(Object destination, Object source, Class destClass, Class sourceClass) { 
     if (source == null) { 
      return null; 
     } 
     if (source instanceof List<?>) { 
      List<?> list = ((List<?>) source); 
      if (list.isEmpty()) { 
       return null; 
      } 
      if (list.get(0) instanceof B1) { 
       List<Long> longList = new ArrayList<Long>(); 
       for (B1 b1 : list) { 
        longList.add(b1.getId()); 
       } 
       return longList; 
      } else (list.get(0) instanceof Long) { 
       // do the inverse of the above 
      } else { 
       throw new MappingException("Wrong type ..."); 
      } 
     } else { 
      throw new MappingException("Converter YourCustomConverter used incorrectly. Arguments passed in were:" 
        + destination + " and " + source); 
     } 
    } 
} 
0

我想你可以通过overridding 的toString做到这一点()方法B1它会工作。

这里的示例代码:

@Override 
public String toString() { 
return new String(this.id); 
} 

而在你的映射做了以下变化:

<field> 
<a>bList</a> 
<b>bList</b> 
<a-hint>B</a-hint> 
<b-hint>java.lang.Long<b-hint> 
</field> 

所以,当推土机试图绑定B1,它将返回其ID为String,然后推土机将执行String和Long之间的自动转换。