我对推土机如何将源对象映射到目标对象感到困惑。我有以下情况:
源对象:
public class Rule {
private String id;
private String name;
private String group;
private String content;
private RuleType ruleType;
private String drlContent;
private boolean enabled;
private Strategy strategy;
// getters and setters
}
目标对象:
public class RuleActivity {
private String id;
private String name;
private Strategy strategy;
// getters and setters
}
XML映射:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<stop-on-errors>true</stop-on-errors>
<date-format>MM/dd/yyyy HH:mm</date-format>
</configuration>
<mapping wildcard="false">
<class-a>com.magick.models.shared.Rule</class-a>
<class-b>com.magick.models.shared.log.RuleActivity</class-b>
<field>
<a>id</a>
<b>ruleId</b>
</field>
<field>
<a>strategy.name</a>
<b>strategy.name</b>
</field>
<field>
<a>name</a>
<b>name</b>
</field>
</mapping>
现在如何将这些映射?我的意思是,目标对象包含完整的策略对象还是仅包含它的strategy.name字段。
最佳答案
首先,默认情况下,推土机映射是双向的。所以,
允许从class-a
映射到class-b
,反之亦然。
完成映射后,如下所示:
<field>
<a>strategy.name</a>
<b>strategy.name</b>
</field>
如果源对象具有不为null的
Strategy
对象,并且具有所有相关字段的值。然后推土机还将为目的地创建一个新的Strategy
对象,并且只会填充新创建的name
对象的Strategy
字段。此外,推土机还可以进行追溯,因此假设源和目标中
Strategy
对象的所有字段的名称和类型相同。推土机将自动映射或复制所有字段。因此,您不必分别映射每个字段。您只需要编写以下内容。<field>
<a>strategy</a>
<b>strategy</b>
</field>
但是,如果您的字段名称或类型不相同,则需要为每个字段定义映射,就像对
id
类的Rule
字段和ruleId
类的RuleActivity
字段所做的那样。<field>
<a>id</a>
<b>ruleId</b>
</field>
希望这可以澄清您的疑问。