Hibernate学习之----------组件映射

在Hibernate组件映射学习时,我们首先要了解什么是组件,组件其实就是一个类中包含另一个类的情况,换句话说就是类的组合。

Hibernate中组件就是类的组合,但组合后如何映射到数据库了,怎样产生数据库表的结构呢?

不过怎样实现组件映射有两种方式:

1.注解

如果采用注解,应该是比较简单的,与联合组件类似;

etg:假设Huasband包含Wife对象(夏娃不是从亚当哪里来的吗?),其实现就是在复合类的组件get方法上申明@Embedded,如下

package suse.ly.domain;

/**
 * 妻子类
 * @author ly-suse
 *
 */
public class Wife {

	
	private String wifename;

	
	private int age;
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getWifename() {
		return wifename;
	}

	public void setWifename(String wifename) {
		this.wifename = wifename;
	}
}

 丈夫类:

package suse.ly.domain;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * 丈夫类
 * @author ly-suse
 *
 */
@Entity
public class Husband {

	private int id;
	
	private String name;

	private Wife wife;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	@Column(nullable=false)
	public String getName() {
		return name;
	}

	@Embedded	//使用Embedded申明为Huasband的组件,
//作为表的一部分而不是单独一张表,因为Wife类没有声明@Entity
	public Wife getWife() {
		return wife;
	}

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

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

	public void setWife(Wife wife) {
		this.wife = wife;
	}
	
}

测试结果程序:

new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);

运行结果:

drop table if exists Husband
create table Husband (id integer not null auto_increment, name varchar(255) not null, age integer not null, wifename varchar(255), primary key (id))
表明创建表husband并将wife属性作为本表字段生成创建数据库的语句。

2.xml配置

 XML配置个人觉得有得复杂,主要是写的太多了:

去掉刚才的所有注解,新建Husband.hbm.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <hibernate-mapping>
        	<class name="suse.ly.domain.Husband" >
        		<id>
        			<generator class="native"></generator>
        		</id>
        		
        		<property name="name"></property>
        	   <!--使用component 声明为该类的组件对象 ,还要是让组件里面配置上它的属性-->	
        		<component name="wife">
        			<property name="wifename"></property>
        			<property name="age"></property>
        		</component>
        	</class>
        </hibernate-mapping>

运行测试结果如同注解方式,需要声明的是我的Wife类按理应该实现java.io.Serializable接口,并重写hashcode和equals方法,但由于本例中没有涉及具体对象保存等操作,没有写上啊,望谅解!