2011-12-12 36 views
4

我有以下区域结构:如何使用推土机将类型的字段映射为抽象类?

abstract class Person { String name; //with getter and setter } 
class Employer extends Person {} 
class Employee extends Person {} 
class Contract { Person contractor; //with getter and setter } 
class PersonDTO implements Serializable { String name; String type; //type == 'Employee' or 'Employer' } 
class ContractDTO implements Serializable { PersonDTO contractor; } 

现在,当我成立了这个以下推土机映射:

<mapping> 
    <class-a>Person</class-a> 
    <class-b>PersonDTO</class-b> 
</mapping> 
<mapping> 
    <class-a>Employer</class-a> 
    <class-b>PersonDTO</class-b> 
</mapping> 
<mapping> 
    <class-a>Contract</class-a> 
    <class-b>ContractDTO</class-b> 
</mapping> 

我的问题是关于从B场Contract.contractor的映射到,因为现场Contract.contractor是一个抽象类,推土机无法猜测如何实例化它。

所以我的问题很简单:我怎么能指示推土机,对于外地Contract.contractor的映射,它应该实例的Employer如果type == 'Employer“和其他地方Employee一个实例?

谢谢你的帮助。

+0

您的Person类是抽象的,但我猜它必须是运行时任何继承类的实例?如何为源对象创建承包商属性? –

+0

@贡萨洛我不明白你的问题。承包商是雇主或雇员,它是通过setContractor(Person承包商)方法设置的 – fabien7474

+0

这在运行时是正确的,Person是您提到的两种类型中的一种,Dozer应该能够计算出并转换正确的具体类型。推土机不会尝试创建抽象类的实例,而是尝试创建承包商在运行时引用的实际对象(即雇主或雇员)。你得到什么样的错误? –

回答

0

你可以用提示来做到这一点。 有点像这样:

<mapping> 
<class-a>Contract</class-a> 
<class-b>ContractDTO</class-b> 
<field> 
    <a>contractor</a> 
    <b>contractor</b> 
    <a-hint>your.package.Employer, your.package.Employee</a-hint> 
    <b-hint>your.DTOpackage.EmployerDTO, your.DTOpackage.EmployeeDTO</b-hint> 
</field> 
</mapping> 
+0

并且如果承包商是Employee的实例? – fabien7474

+0

查看我的更新。你可以试试看。 :-) –