Component映射

来源:互联网 发布:重新加载js不刷新页面 编辑:程序博客网 时间:2024/05/19 04:07

Component映射也叫组件映射

出现原因:

如有两个对象模型:

public class User {

private int id;

private String name;

        private String email;

private String address;

private String zipCode;

private String contactTel;

}

public class Employee {

private int id;

private String name;

       private String email;

private String address;

private String zipCode;

private String contactTel;

}

从对象模型来看有些东西就重复了,如红色部分的联系信息,对象模型中粒度细一点比较好,复用率就高一些,所以把那些联系信息单独拿出来,如下:

public class Contact {

private String email;

private String address;

private String zipCode;

private String contactTel;//他作为了实体类的一部分

}

User变为:



public class User {

private int id;

private String name;

private Contact userContact;

}

Employee变为:

public class Employee {

private int id;

private String name;

private Contact employeeContact;

}

原理图:


具体映射如下:

User.hbm.xml

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<component name="userContact">
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component>

</class>
</hibernate-mapping>

Employee.hbm.xml

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Employee" table="t_emplyee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<component name="employeeContact">
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component>
</class>
</hibernate-mapping>

测试如下:

public class ComponentMappingTest extends TestCase {
public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//建立User实体类
User user = new User();
user.setName("张三");

//建立Contact值类,值类通常从属于实体类
Contact userContact = new Contact();
userContact.setEmail("email");
userContact.setAddress("address");
userContact.setZipCode("zipCode");
userContact.setContactTel("contactTel");
user.setUserContact(userContact);

session.save(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
User user = (User)session.load(User.class, 1);
System.out.println(user.getName());
System.out.println(user.getUserContact().getAddress());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}

Component是某个实体的逻辑组成部分,它与实体类的主要差别在于,它没有oid 

Component在DDD中称为值类

采用Component的好处:实现对象模型的细粒度划分,复用率高,含义明确,层次分明

对象模型与关系模型的设计恰恰相反,对象模型一般是细粒度的,关系模型一般是粗粒度的

原创粉丝点击