一、简介
component映射就是当一个工程中有多个实体,同时各实体中有多个字段相同,我们将这些相同的字段提取成一个类,作为真正实体类的一个组件。在Hibernate中component是某个实体的逻辑组成部分,与实体的根本区别是没有oid,也称为值对象(DDD中)。也叫组件映射。
-
采用此种映射的好处
- 实现了对象模型的细粒度划分,层次会更分明,服用率会更高。
- 配置组件类的时候使用<component>标签,同时在存储的时候不需要保存组件类,因为组件类不是一个实体。直接存储实体类就可以了。
二、实例(工程hibernate_component_mapping
)
相关映射:
User.java
private int id;
private String name;
private Contact contact;
Contact.java
private String email;
private String address;
private String zipCode;//邮编
private String contactTel;
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.hibernate.User" table="_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<component name="contact">
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component>
</class>
</hibernate-mapping>
说明:本来Contact类中的四个属性都是属于User类的,但是可以看到这四个属性都是属于联系方式,可能其他类可能也会用到这些属性,所以这里我们将其抽取出来成为一个单独的类作为User类的一个组成部分,但是注意这个类在数据库中是不会形成一个表的。
测试:
ComponentMappingTest.java
package cn.itcast.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
public class ComponentMappingTest extends TestCase {
public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
User user = new User();
user.setName("张三");
Contact contact = new Contact();
contact.setAddress("xxxxx");
contact.setEmail("xxx@rrr.com");
contact.setZipCode("1111111");
contact.setContactTel("9999999999");
user.setContact(contact);
session.save(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
说明:其实这种映射和继承映射很像,其使用方式也差不多,这里不多说。