@(Hybris Item And Bean定义)
注:Mode和DTO皆不需要自己手动编写,可通过hybris的Item.xml,bean.xml配置自动生成这也是hybris的强大之处
Item
item是hybris中程序员可以接触到的最接近底层的东西,GenericItem是所有实体类最底层的父类,相当于Java类型系统的java.lang.Object,所有的item默认继承GenericItem
Model的定义
autocreate = true: 在执行Hybris命令行ant initialize进行Hybris系统初始化时,根据items.xml的定义在数据库表中创建对应的类型。
generate = true: 在ant编译时生成该类型对应的POJO类。
(默认generate和autocreate为true,如果generate = false,也会生成对应的model,但是不会生成对应的jalo。如果generate = true,会生成对应工程的model以及jalo,想要子继承父,需要设置父的generate为true。如果设了deployment table,那么autocreate需设置为true,当updatesystem时,会生成对应的表)
<itemtypes>
<itemtype code="Person" generate="true">
<deployment table="Persons" typecode="32333"/>
<attributes>
<attribute qualifier="name" type="java.lang.String">
<persistence type="property"/>
</attribute>
<attribute qualifier="age" type="java.lang.Integer">
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
<itemtype code="Animal">
<deployment table="Animal" typecode="32231"/>
<attributes>
<attribute qualifier="name" type="java.lang.String">
<persistence type="property"/>
</attribute>
<attribute qualifier="age" type="java.lang.Integer">
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
<itemtype code="Plant">
<deployment table="Plant" typecode="32330"/>
<attributes>
<attribute qualifier="name" type="java.lang.String">
<persistence type="property"/>
</attribute>
<attribute qualifier="age" type="java.lang.Integer">
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
<itemtype code="Teacher" extends="Person">
<attributes>
<attribute qualifier="century" type="java.lang.String">
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
</itemtypes>
bean
bean.xml主要用于定义一些Data,Data类似普通java工程中的dto,在hybris中,service层返回model,然后由facade层调用convert,把model转化为Data返回给controller使用,convert的具体使用,下文会具体讲解
<bean class="org.caps.training.Data.BaseItem">
<property name="code" type="java.lang.String"/>
<property name="created" type="java.util.Date"/>
<property name="updated" type="java.util.Date"/>
<property name="type" type="java.lang.String"/>
<property name="action" type="java.lang.String"/>
</bean>
<bean class="org.caps.training.Data.TeacherData" extends="org.caps.training.Data.BaseItem">
<property name="name" type="java.lang.String"/>
<property name="age" type="java.lang.Integer"/>
<property name="address" type="java.lang.String"/>
</bean>
convert &popular
convert主要作用于facade层,一般配合popular一起使用,在convert中配置相关的popular,实现model到data的转换
使用方式
- 自定义一个Populator,实现Populator接口,泛型传入一个model和一个data
- 把这个Populator注入到spring中
- 注入一个Converter,父类是abstractPopulatingConverter,设置targetClass和populators
调用convert
案例如下:
- 自定义populator
public class TeacherModelPopular implements Populator<TeacherModel, TeacherData> {
@Override
public void populate(TeacherModel teacherModel, TeacherData teacherData) throws ConversionException {
teacherData.setCode(teacherModel.getCode());
teacherData.setAge(teacherModel.getAge());
teacherData.setName(teacherData.getName());
teacherData.setAddress(teacherModel.getAddress());
teacherData.setType("TeacherData");
teacherData.setCreated(new Date());
}
}
- 注入spring
<bean id="teacherModelPopular" class="org.caps.training.convert.pop.TeacherModelPopular"/>
<bean id="teacherModelConverter" parent="abstractPopulatingConverter">
<property name="targetClass" value="org.caps.training.Data.TeacherData"/>
<property name="populators">
<list>
<ref bean="teacherModelPopular"/>
</list>
</property>
</bean>
- 调用
@Resource(name = "teacherModelConverter")
private Converter<TeacherModel, TeacherData> teacherModelConverter;
TeacherData convert = teacherModelConverter.convert(modelByExample,new TeacherData());