hibernate组件映射和继承映射

一、组件映射

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值