Hibernate的关系映射
一、Hibernate的概念
在了解什么是Hibernate之前我们先来看看什么是ORM呢?
1.(对选哪个-关系映射)ORM-Object Relational Mapping的概念
对象-关系映射(Object Relational Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把域模型表示的对象映射到关系数据模型对应的数据库结构中去。
通过ORM思想在操作实体对象的时候,就不需要再去和复杂的 SQL语句打交道,只需简单的操作实体对象的属性和方法,ORM 技术是在实体类对象和数据库表之间提供了一条桥梁,对象型数据和数据库中的关系型数据通过这个桥梁来相互转化
2.使用ORM的原因
简单的说ORM的最大的一个优点就是,可以减少编写那些被重复使用的SQL语句代码;
我们只需要编写对实体对象的简单操作即可
2-1实体类(持久化类)
一个简单的实体类(持久化类)应该具备的条件如下所示:
1.私有属性
2.属性对应的set方法
3.属性对应的get方法
4.无参的构造方法(虽然我们在实例化的时候系统会自动生成无参的构造方法,但是为了保证在拥有有参构造方法的时候能够没有后顾之忧)
5.重写toString方法
3.实体类(持久化类)与一个表的对应关系
1.类----表
2.对象---记录
3.属性---列
4.Hibernate的概念
在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架;
Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架;
Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。
5.编写一个Hibernate项目的步骤
前提:安装Eclipse、下载Hibernate并解压缩
1.在Eclipse下创建新的项目
2.引入相应的jar包(Hibernate以及数据库驱动包)
3.编写Hibernate配置文件(注意哪些属性是必写的,哪些是可选的)
4.创建实体类(持久化类)
5.编写实体类(持久化类)对应的映射配置文件(理论是上右多少个实体类就有多少个映射配置文件)
6.使用Hibernate API 完成对象的持久化。
相应的jar包例图
相应的Hibernate配置文件
注意:Hibernate文件在src文件下
<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,
XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的根元素,其他文件要包含在其中-->
<hibernate-configuration>
<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->
<session-factory>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/lkf?characterEncoding=UTF-8</property>
<!-- 连接数据库时数据的传输字符集编码方式 -->
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!--连接数据库时的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库时的密码-->
<property name="hibernate.connection.password">123456</property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,
程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化输出的Sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定映射文件,可映射多个映射文件-->
<!-- <mapping class="com.wpf.entity.IdCard"/> -->
<mapping resource="com/lkf/entity/Student.hbm.xml"/>
<mapping resource="com/lkf/entity/IdCard.hbm.xml"/>
<mapping resource="com/lkf/entity/Role.hbm.xml"/>
<mapping resource="com/lkf/entity/Course.hbm.xml"/>
</session-factory>
</hibernate-configuration>
相应的实体类(持久化类)例图
相应的实体类(持久化类)对应的映射配置文件
注意:映射配置文件额实体类(持久化类)在同一个文件夹下
测试:实现添加操作
public static void save() {
Configuration cfg=new Configuration().configure();
SessionFactory factory=cfg.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Student student=new Student();
student.setName("小刘");
IdCard card=new IdCard();
card.setCardNo("1002");
card.setStudent(student);
student.setCard(card);
Role role1=new Role();
role1.setRname("会员");
Role role2=new Role();
role2.setRname("超级会员");
role1.setStudent(student);
role2.setStudent(student);
student.getRole().add(role1);
student.getRole().add(role2);
Course course1=new Course();
course1.setCname("语文");
Course course2=new Course();
course2.setCname("数学");
Course course3=new Course();
course3.setCname("英语");
course1.getStudent().add(student);
course2.getStudent().add(student);
course3.getStudent().add(student);
student.getCourse().add(course1);
student.getCourse().add(course2);
student.getCourse().add(course3);
session.save(student);
tran.commit();
session.close();
factory.close();
}
二、Hibernate的关系映射分类
1.一对一关联映射
一对一关联的方式:
1.主键关联映射
2.唯一外键关联映射(外键使用unique唯一约束)
实例:
一个人对应着一个身份证号
一个身份证号对应着一个人
一对一的映射配置文件为(主键关联映射):
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lkf.entity">
<class name="IdCard" table="card" >
<id name="id" column="id" >
<generator class="foreign">
<param name="property">student</param>
</generator>
</id>
<property name="cardNo" column="cardNo" />
<one-to-one name="student" class="Student" constrained="true"/>
</class>
</hibernate-mapping>
***注意:
1.hibernate-mapping中的package属性的值是文件所在的位置
2.class中的name是实体类(持久化类)的类名
3.class中的table时实体类(持久化类)对应的表名
4.id中的name是实体类中的主键属性
5.id中的column是实体类对应表中的字段名
6.
student表示该表的主键既是主键也是外键,并且是参照Student表
7.property是实体类中其他属性的设置
8.one-to-one即一对一的设置
9.one-to-one中的name属性是现在所属实体中关联的类对象属性
10.one-to-one中的class是本实体类关联的实体类
11.one-to-one中的constrained的值为true:表明该实体类对应的表的id为外键,并且该外键是参照本实体类关联实体类对象对应的表的主键
注意:
<many-to-one name="student" class="Student" unique="true" column="sid"/>
many-to-one 的name属性表示该实体类对应的关联类对象
many-to-one 的class属性表示该实体类关联的实体类
many-to-one的column属性表示的是外键的列
many-to-one的unique为true表明是唯一的外键约束
注意使用唯一外键关联时的一对一需要有property-ref属性 ,表明建立了从name对象的实体类到该属性的值的实体类一对一的关联关系
2.一对多关联映射
实例:
一个班级有多个学生
(对于班级实体类是一对多关联)
(对于学生实体类是多对一关联)
一对多的关联分类
单向一对多关联<one-to-many>
单向多对一关联<many-to-one>
双向一对多关联既又<one-to-many>也有<many-to-one>
一对多的关联关系中存在着外键关联,而且外键是是由多方参照一方的主键
在实体类的映射配置文件中使用set元素配置
set元素中的name属性表示当前实体类的关联实体类对象
set元素的cascade属性表示级联
级联的四个属性值如霞所示:
1.none:默认情况下是none,表明没有级联
2.all:包括所有的级联情况(保存、删除、更新)
3.delete:表示删除级联
4.save-update:既表示保存级联又表示更新级联
set元素的inverse属性表示对外键的控制权
1.inverse的值为true表明
放弃对外键的维护权
2.inverse的值为false(默认情况下就是false)表明
拥有对外键的维护权
注意:many-to-one中没有inverse属性,因为默认情况下由多方来维护外键
3.多对多关联
多对多关联使用中间表来实现
即中间表的外键是参照实体类中的主键的
两个实体类中都有各自实体类关联的实体类的set集合对象
多对多映射文件的实现
Student表中的映射配置文件
set元素中的name属性指的是该实体类中关联实体类的Set集合对象
set元素的table属性指的是中间表的表名
set元素的inverse属性指的是外键的维护权
inverse="true"表示放弃对外建的维护权
inverse="false"表示不放弃外键的维护权
key元素的column指的是该实体类对应的表在中间表的外键名
set元素的子元素<many-to-many>元素中的calss指的是该实体类关联的实体类型
set元素的子元素<many-to-many>元素中column指的是该实体类关联的实体类对应的表在中间表的外键名