分层体系结构
对象-关系映射(Object Relational Mapping)
- 对象-关系映射(ORM),是随着面向对象的软件开发方法发展而产生的。用来把域模型表示的对象映射到关系数据模型对应的数据库结构中去。
- 通过ORM思想在操作实体对象的时候,就不需要再去和复杂的 SQL语句打交道,只需简单的操作实体对象的属性和方法,ORM 技术是在实体类对象和数据库表之间提供了一条桥梁,对象型数据和数据库中的关系型数据通过这个桥梁来相互转化.
- 一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 记录 |
属性 | 字段 |
Hibernate
Hibernate是什么?
- 在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架
- Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架
- Hibernate是对JDBC API的封装,是JDBC轻量级封装框架
创建Hibernate项目的步骤
- 引入Hibernate及其依赖库(jar包);
- 编写Hibernate配置文件;
- 创建Java持久化类XXX.java;
- 编写持久化类的映射配置文件XXX.hbm.xml;
- 使用Hibernate API 完成对象的持久化。
Hibernate核心配置文件
hibernate.cfg.xml
<?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-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaijdbc:mysql://localhost:3306/MyDB</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping resource="com/test/entity/XXXX.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- hibernate-configuration是hibernate配置文件的根元素
- SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作
- 在session-factory元素里使用property子元素进行对应的配置
必须的配置
hibernate.dialect:配置数据库方言
hibernate.connection.driver_class:配置数据库的驱动
hibernate.connection.url:配置数据库连接url
hibernate.connection.username:连接数据库的用户名
hibernate.connection.password:密码
可选配置
hibernate.show_sql:在控制台打印使用的SQL语句
hibernate.format_sql:格式化输出SQL语句
hibernate.hbm2ddl.auto:update数据库中没有表则自动创建一张表,如果有则更新
hibernate.current_session_context_class:thread 使用ThreadLocal管理Session - mapping子元素:指定映射文件
不使用注解配置的方式:resource=“com/test/entity/Product.hbm.xml”
使用注解配置的方式: class=“com.test.entity.Product”
持久化类文件配置
XXXX.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- hibernate-mapping package=完全限定名(包名.类名) -->
<hibernate-mapping package="com.text.entity">
<!--class 类与表的映射 name="对应持久化类的类名" table="数据库中的表名" -->
<class name="XXXX" table="xxxx">
<!-- 属性与字段的映射 id 配置主键 name=类中的属性 column=数据库中的字段 -->
<id name="" column>
<generator class="indentity"></generator>
</id>
<!--property 属性与字段的映射 name=类中的属性 column=数据库中的字段 -->
<property name="name" column="name"></property>
</class>
</hibernate-mapping>
- hibernate-mapping
package属性可以不配置但是要在class元素中的name属性中要写完全限定名,而不是直接写类名。 - class元素
name属性设定对应的类名
table属性设定数据库中的类名,默认以类名作表名 - id子元素:配置主键
name属性:配置对应类的属性名
column属性:配置数据库中的字段 - property子元素:配置非主键的字段,顺序不能在id之前
name属性:配置对应类的属性名
column属性:配置数据库中的字段
Hibernate中如何区分对象
- Hibernate 采用对象标识符 OID区分对象。
- OID 是关系数据库表中的主键(通常是代理主键)在 Java 对象模型中的等价物;
- Hibernate 采用 OID 来维持Java持久化类和数据库表中对应关系;
- OID 与表中代理主键对应,OID 也是整数类型,Hibernate 允许在持久化类中把OID定义为以下三种类型:
Short、Integer、Long
为了保证 OID 的唯一性,通常由 Hibernate 或底层数据库给 OID 赋值。
Hibernate 自带了很多种标识符生成器
-
increment标识符:该机制是 Hibernate 以递增的方式为OID赋值。
不依赖于底层数据库系统,适合所有数据库;
适合单独的 Hibernate 应用使用,不适合在集群情况下使用 -
identity标识符:该机制依赖于底层数据库,需要数据库支持自动增长字段。
例如:MySQL、MSSQL、DB2、Sybase等。 -
assigned 标识符:该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。
例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。 -
native自动选择合适的标识符生成器;
-
sequence采用数据库提供的序列方式;
实体之间的关系
- 一对一关系(1:1)
- 一对多关系(1:n)
- 多对多关系(m:n)
一对一关系
-
域模型
-
实体类
-
Hibernate提供了两种映射一对一关系的方式
-
主键关联映射
关系数据模型
-
在对应的实体类配置文件(User.hbm.xml)中使用one-to-one元素进行配置
- 主键关联映射在主键表中的配置
name属性:指定要映射的属性名
class属性:指定所关联的类
<one-to-one name="person" class="Person"/>
- 外键表的配置
外键表实体类配置文件中 OID 使用 foreign 生成策略
并且在one-to-one元素中设置constrained属性为true,表示外键表ID为外键,并且参照主键表的ID
<id name="id" >
<generator class="foreign" >
<param name="property" >user</param>
</generator>
</id>
<one-to-one name="user" class="User" constrained="true"></one-to-one>
- 唯一外键关联映射
关系数据模型
- 主键表的配置
property-ref属性:表面建立一对一关系
<one-to-one name="user" property-ref="person" />
- 外键表
在外键表中使用many-to-one元素进行配置,一对一关系可看成特殊的多对一关系
unique属性:表示设置唯一约束
<many-to-one name="person" column="pid" unique="true"></many-to-one>
一对多关系
-
域模型
-
单向一对多
-
双向一对多
-
关系数据模型
双向一对多配置
- 实体类
- 实体类配置
- 主键表
使用set元素配置
name属性:指定要映射的属性名
inverse属性:设置是否维护外键,默认false即维护外键
cascade属性:设置级联 all save-update delete none,默认为none
key子元素:指定外键字段名
one-to-many元素:class属性指定关联的类
<set name="orderSet" inverse="true" cascade="all">
<key column="USERID"></key>
<one-to-many class="Order"></one-to-many>
</set>
- 外键表
使用many-to-one元素进行配置
name 属性:指定需映射的属性名
column 属性:指定外键字段名
class 属性:指定所关联的类型
<many-to-one name="user" column="USERID" class="User"></many-to-one>
多对多关系
- 域模型
- 关系数据模型
- 实体类
- 实体类映射配置
- Student.hbm.xml
使用set元素进行配置
table属性:指定数据库中 中间表的表名
inverse属性:设置是否维护外键,false即维护外键
cascade属性:设置级联 all save-update delete none,默认为none
key元素:指定在中间表中的外键字段名
many-to-many元素:class属性指定关联的类 column属性指定关联的类在中间表的外键名
<set name="courseSet" table="student_course" inverse=false cascade="all">
<key column="SID"></key>
<many-to-many class="Course" column="CID"></many-to-many>
</set>
2.Course.hbm.xml
<set name="studentSet" table="student_course" inverse=true>
<key column="CID"></key>
<many-to-many class="Student" column="SID"></many-to-many>
</set>