【HIbernate框架学习】:Hibernate组件映射

        假设我们设计的User实体类和Employee实体类,两个实体类包含的一些信息是相同的,我们可以抽取出来单独

成一个Component类,达到复用的目的,而且原来的类不再那么臃肿,看起来比较简单清晰明了。

       我们来看简单的演示图例:

       

       在Hibernate中Component映射采用<component>标签,元素包含的子元素是<property>元素,这里面放的

是组件类的字段。

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

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

       简单实例代码:

       Component实体类:

package com.demo.domain;

public class Contact {

	private String email;
	private String address;
	private String zipCode;
	private String contactTel;

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getZipCode() {
		return zipCode;
	}

	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}

	public String getContactTel() {
		return contactTel;
	}

	public void setContactTel(String contactTel) {
		this.contactTel = contactTel;
	}
	
}

       User实体类:

package com.demo.domain;


public class User {
	
	private int id;
	private String name;
	private Contact userContact;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Contact getUserContact() {
		return userContact;
	}

	public void setUserContact(Contact userContact) {
		this.userContact = userContact;
	}
	
}

       Employee实体类:

package com.demo.domain;

public class Employee {

	private int id;
	private String name;
	private Contact employeeContact;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Contact getEmployeeContact() {
		return employeeContact;
	}

	public void setEmployeeContact(Contact employeeContact) {
		this.employeeContact = employeeContact;
	}
	
}

       User实体类对象关系映射文件:

<?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="com.demo.domain.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实体类对象关系映射文件:

<?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="com.demo.domain.Employee" table="t_employee">
		<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>

       测试类:

package com.demo.test;

import org.hibernate.Session;

import com.demo.domain.Contact;
import com.demo.domain.HibernateUtils;
import com.demo.domain.User;

import junit.framework.TestCase;

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);
		}
	}		
}

       testSave1()方法:

       控制台输出:

       

       数据库显示:

       

         

       testLoad1()方法:

       控制台显示:

       


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值