一、组件映射
1.简介
将一个对象的多个属性封装成单独的另一个对象,这个封装的对象成为组件Component,组件不需要单独的映射文件。
对象关系:一个对象是另一个对象的一部分
2.数据库表
创建表 t_consumer
create table t_consumer(
id int primary key auto_increment,
age int,
first_name varchar(200),
last_name varchar(200),
)
创建实体类 Consumer属性分别为id,age,name,创建实体类Name属性分别为 id,firstName,lastName
3.配置方式
<?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映射文件、通过映射文件说明实体类和数据表的关联关系 -->
<hibernate-mapping package="cn.com.pojo">
<class name="Consumer" table="t_consumer">
<id name="id" column="id">
<!-- 指定主键生成策略、native是自增主键 -->
<generator class="native"></generator>
</id>
<!-- 普通字段 -->
<property name="age" column="age" type="java.lang.Integer"></property>
<!--
配置主键映射关系
name : 属性名
class : 属性类型
-->
<component name="name" class="Name">
<property name="firstName" cloumn="first_name"></property>
<property name="lastName" cloumn="last_name"></property>
</component>
</class>
</hibernate-mapping>
4.测试类
Consumer c = (Consumer)session.get(Consumer.Class,1);
System.out.println(c.getName());
二、继承映射
1.简介
1.1概念
在面向对象中很重要的一个特性就是继承,继承实现了代码的复用,Hibernate也支持继承
Hibernate支持三种继承映射方式:
- 每个继承关系用一张表
- 每个子类一张表
- 每个类一张表
1.2 关于继承关系
系统中有三个角色:系统用户、管理员、普通用户
- 系统用户:id username password
- 管理员:id username password tel
- 普通用户:id username password address
2.每个继承关系只用一张表
2.1创建表 t_sys_user
create table t_sys_user(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
tel varchar(50),
address varchar(50),
type int //0为管理员、1普通用户
)
2.2 配置方式
创建实体类 SysUser属性为id、username、password
创建Manager继承SysUser 类,并添加自己的属性 tel
创建Member继承SysUser 类,并添加自己的属性 address
配置文件(父类)
<?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映射文件、通过映射文件说明实体类和数据表的关联关系 -->
<hibernate-mapping package="cn.com.pojo">
<class name="SysUser" table="t_sys_user">
<id name="id" column="id">
<!-- 指定主键生成策略、native是自增主键 -->
<generator class="native"></generator>
</id>
<!--
指定如何区分子类
column:指定使用哪个字段类区分
注意:根据dtd的规则,该元素要放到<property>前边
-->
<discriminator column="type"></discriminator>
<!-- 普通字段 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<!--
每个子类的配置
-->
<subclass name="Manager" discriminator="0">
<property name="tel" column="tel"></property>
</subclass>
<subclass name="Member" discriminator="1">
<property name="address" column="address"></property>
</subclass>
</class>
</hibernate-mapping>
2.3 编写测试类
Manager mgr = (Manager)session.get(Manager.Class,1);
System.out.printl(mgr);
3.每个子类一张表
3.1创建数据表和实体类
创建数据表 t_manager 、t_member
create table t_manager(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
tel varchar(50)
)
create table t_member(
id int primary key auto_increment,
username varchar(200),
password varchar(200),
address varchar(50)
)
实体类设计不变
配置文件(Manager)
<?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映射文件、通过映射文件说明实体类和数据表的关联关系 -->
<hibernate-mapping package="cn.com.pojo">
<class name="Manager" table="t_manager">
<id name="id" column="id">
<!-- 指定主键生成策略、native是自增主键 -->
<generator class="native"></generator>
</id>
<!-- 普通字段 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="tel" column="tel"></property>
</class>
</hibernate-mapping>
配置文件(Member)
<?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映射文件、通过映射文件说明实体类和数据表的关联关系 -->
<hibernate-mapping package="cn.com.pojo">
<class name="Member" table="t_member">
<id name="id" column="id">
<!-- 指定主键生成策略、native是自增主键 -->
<generator class="native"></generator>
</id>
<!-- 普通字段 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
3.2 编写测试类
Manager mgr = (Manager)session.get(Manager.Class,1);
System.out.printl(mgr);
4.每个类一张表
4.1数据库表 t_sys 、t_manager、t_menber
create table t_sys(
id int primary key auto_increment,
username varchar(200),
password varchar(200)
)
create table t_manager(
id int primary key auto_increment,
tel varchar(50),
user_id,
froeign key(user_id) references t_sys(id)
)
create table t_member(
id int primary key auto_increment,
address varchar(50),
user_id,
froeign key(user_id) references t_sys(id)
)
实体类不变
4.2 配置文件
配置文件(SysUser)
<?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映射文件、通过映射文件说明实体类和数据表的关联关系 -->
<hibernate-mapping package="cn.com.pojo">
<class name="Member" table="t_member">
<id name="id" column="id">
<!-- 指定主键生成策略、native是自增主键 -->
<generator class="native"></generator>
</id>
<!-- 普通字段 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<!--
通过外键关联子类
-->
<joined-subclass name="Manager" table="t_manager">
<!-- 关联列,外键列-->
<key column="user_id"></key>
<!-- 包含的属性-->
<property name="tel"></property>
</joined-subclass>
<joined-subclass name="Member" table="t_member">
<!-- 关联列,外键列-->
<key column="user_id"></key>
<!-- 包含的属性-->
<property name="address"></property>
</joined-subclass>
</class>
</hibernate-mapping>
4.3 编写测试类
Manager mgr = (Manager)session.get(Manager.Class,1);
System.out.printl(mgr);
Member mbr= (Member)session.get(Member.Class,1);
System.out.printl(mbr);