您的位置:首页 > 其它

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

2016-12-17 22:19 274 查看
假设我们设计的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()方法:

控制台显示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: