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的好处:实现对象模型的细粒度划分,复用率高,含义明确,层次分明
对象模型与关系模型的设计恰恰相反,对象模型一般是细粒度的,关系模型一般是粗粒度的