在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方法,但由于本例中没有涉及具体对象保存等操作,没有写上啊,望谅解!