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

 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"  class="Contact">
			<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);
		}
	}		
}

以上转自https://blog.csdn.net/erlian1992/article/details/53715036

猜你喜欢

转载自blog.csdn.net/qq_21225505/article/details/81807452