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