Hibernate是一个对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得可以使用对象编程思维来操纵数据库。看到这里应该了解到Hibernate也是一个持久层框架。
ORM的简单规则:
- 类跟表对应
- 类属性与表字段对应
- 类实例与表中具体一条记录对应
- 一个类可与多个表对应,一个表也可对应多个类
- DB中表与表之间的关系(如:外键)映射成为Object之间的关系
Hibernate主要通过5核心个接口来进行对象的持久化操作和事务控制:
- Configuration接口:主要对Hibernate进行配置、启动Hibernate并连接数据库系统,在启动HIbernate的过程中,Configuration实例首先确定HIbernate映射文件的位置,然后读取相关的配置,最后创建一个唯一的SessionFactory实例,这个唯一的SessionFactory实例负责进行所有的持久化操作。Configuration对象只存在系统的初始化阶段
- SessionFactory接口:主要负责HIbernate的初始化。它作为数据存储源的代理,负责建立Session对象。 具体来说,在HIbernate中SessionFactory实际起了一个缓冲区的作用,HIbernate自动生成的SQL语句、映射数据以及某些可重复利用的数据都可存放在这个缓冲区中。同时,它还保存了数据库配置的所有映射关系
- Session接口:Session接口是HIbernate中使用最为广泛的接口,也是持久化的核心。Session对象的生命周期以Transaction对象的事务开启和结束为边界。Session提供了一系列与持久化相关的操作,如读取、创建、和删除相关实体对象的的实例(即数据库中数据的增删改查),因此,Session也被称为持久化管理器
- Transaction接口:Transaction接口主要用于管理事务,是HIbernate的数据库事务接口,它对底层的事务接口进行了封装。
- Query接口:Query接口是HIbernate的查询接口,用于向数据库中查询对象,并控制执行查询的过程。在HIbernate中有三种检索方式,分别为HQL检索方式、QBC检索方式和SQL检索方式。传统的SQL查询语言是结构化的查询方式,这种方式并不适用于查询以对象形式存在的数据。
HIbernate的具体操作步骤:
public void init(){
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory = config.buildSessionFactory(serviceRegistry);
//创建会话对象
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
}
1. 创建一个配置对象(configuration对象 用来读取cfg.xml文件)
2. 利用配置对象创建的服务注册对象来创建会话工厂(在创建会话工厂的同时读取hbm.xml里的对象关系映射文件)
3. 在会话工厂了开启一个会话
4. 开启一个事物(seesion对象的方法必须要封装在事务当中,如果不开启在事务中,并且手工提交事务,对象并不会真正保存在数据库中)
5. 运行完方法后关闭事务,在关闭会话
如果不开启事务的话应该调用Session对象的dowork方法(一般不推荐使用),记得在session.save();前操作doWork(new Work(){conn.setAutoCommit(true);});时,记得在session.save();后调用session.flush()
Hibernate中的关联关系映射
对象之间都不是孤立存在的,他们之间往往需要相互引用以实现交互,这种对象之间的相互访问就是关联关系。在hibernate对象间的关联关系就表现为数据库中表与表的关系。 表可以通过外间进行关联,Hibernate中的关联操作可以减少多表连接时的代码量,并保持表之间的代码同步。
Hibernate关联关系可分为单向关联和双向关联两大类
单向:
分为一对一、一对多、多对一、和多对多四种关联关系
- 一对一关联有外键关联和主键关联两种方式
- 一对多则是通过外键进行关联的 需要在“多”的一边增加一个外键,并由“一”的一方指向"多"的一方,在"一"的一段的实现类中定义一个Set集合属性,使“多”的一方实例以集合的形式存在 (需在在hbm.xml文件中指定外键<key>)
- 多对一 同样也是通过外键来进行关联的 多对一映射方式类似于一对多,不过它是由"多"的一方指向"一"的一方。在多的一方的数据表中增加一个外键来指向表示"一"的一方数据表,"一"的一方作为主表,"多"的一方作为从表
- 而多对多则是利用一个中间表将两个主表关联起来。中间表的作用是将两张表的主键作为其外键,通过外键建立这两张表之间的映射关系。并且要在主控端的类定义中增加一个Set属性集合,使得被关联的一方的类的实例以集合的形式存在。
双向:
分为一对一、一对多和多对多3种关联关系