Hibernate
用IOC容器来管理Hibernate的SessionFactory
让Hibernate使用上Spring的声明式事务
数据库事务
事务的概念来自于两个独立的需求:并发数据库访问,系统错误恢复。
一个事务是可以被看做一个单元的一些列SQL语句的集合。
ACID
原子性 事务作为一个整体被执行,要么全部被执行,要么都不执行
一致性
隔离性
持久性
表的行,记录
表的列,字段
ORM框架是对JDBC的封装。
hibernatetool 插件!
Configuration 类,读取Hibernate配置文件,生成SessionFactory对象
SessionFactory 接口,产生Session实例工程。
Session 接口,用来操作PO。get(),load(),save(),update()。
Query 接口,对PO进行查询。通过Session的createQuery()生成。
Transaction 接口,管理Hibernate事务。commit(),rollback(),从Session的beginTransaction()生成。
1. Spring 整合 Hibernate 整合什么?
1). 由Spring的IoC容器管理Hibernate的Sessionfactory
2). 让Hibernate使用上Spring的声明式事务
2. 整合步骤
数据源需要配置到IOC容器中,所以在此不用配置
关联的.hbm.xml,也在IOC容器配置SessionFactory实例时进行配置
1). 加入Hibernate
jar包
添加hibernate的配置文件:hibernate.cfg.xml 配置Hibernate的基本属性,方言,SQL,显示及格式化,生成数据表策略及二级缓存等(也可以不放在这里)
编写持久化类,以及对应的.hbm.xml文件
2). 加入Spring
jar包
加入Spring的配置文件 配置数据源,配置Hibernate的Sessionfactory实例,Spring的声明式事务
3). 整合
hibernate 映射关系
以Emp & Dep为例
1. 一对多 Dep为一,Emp为多
不用Hibernate,建立POJO需要在Emp中加入Dep的主键Dep.id作为外键。在Dep中则不需要任何操作(?)。
使用Hibernate,在“一”的一方(Dep)加入一个set集合存放"多"的一方(Emp),同时,在"多"的一方添加一个"一"的一方的对象,表示所属的部门。
映射文件中,"一"的一方,用一个set标签,指明其主键,也就是"多"的外键,标明one-to-many关系;"多"的一方,使用many-to-one标签,指明"一"的属性和主键。
2. 多对多 Stu为多,Course也为多
数据库中,多对多的关系,一般使用中间表的方式处理,将多对多转化为两个一对多。
在<set>标签中,通过table属性指定仅包含两个表主键的中间表,并用<key>指定外键,用于从中间表取数据。
3. 一对一 Team and Address
一对一外键关联,看成一对多的一种特殊形式,多方退化成一。
一对一主键关联,一张表生成主键,另一张通过foreign关键字参考。
Hibernate的hql语句中,查询的是实体类和实体类的属性,类名和属性名必须一致。
Hibernate的映射文件可以直接创建,也可以不创建而是用注解。
many-to-one
a child entity and a parent
parent is a FK of child
@OneToMany
a parent entity with one or more child entities
uni-one-to-many
@OneToMany don't have a mirroring @ManyToOne
中间表实现
bi-one-to-many
There is a @ManyToOne association on the child side
parent is a FK of child
uni-one-to-one
bi-one-to-one
1. 新建Maven Webapp项目
2. 设置项目目录结构
3. 配置web.xml文件,设置DispatcherServlet,
classpath:springmvc.xml, mapping
4. 在src/main/java下,配置springmvc.xml,
设置自动扫描包目录,设置视图解析器
5. 在同目录下,配置dp.properties,
配置数据库连接
6. 配置hibernate.cfg.xml文件
7. 配置applicationContext.xml文件,配置自动扫描
包,配置db.properties位置,配置dataSource和
数据连接池,配置Sessionfactory,配置transactionManager
领域对象,也被称为实体类,他不一定等同于数据库表,但在简单应用中,它往往拥有对应的数据库表。
使用基于注解的实体映射方法时,需要在*cfg.xml文件中设置mapping实体。
双向一对多,一的一方需要设置@JoinColumn