1、创建持久化Java类(Hibernate不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低入侵式设计的原因)
1)提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance()来实例持久化类。
2)提供一个标识属性(Identifier property):通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用。
3)为了类的持久化类字段声明访问方法(get/set):Hibernate对JavaBean风格的属性实行持久化
4)使用非final类:在运行时生成代理是Hibernate的一个重要的功能,如果持久化类没有实现任何接口,Hibernate使用CGLIB生成代理,如果使用的是final类,则无法生成CGLIB代理
5)重写equals和hashCode方法:如果需要把持久化类的实例放到Set中(当需要 进行关联映射时),则应该重写这两个方法。
2、创建对象-关系映射文件:
1)Hibernate采用XML格式的文件来指定对象和关系数据之间的映射,在运行时Hibernate将根据这个映射文件来生成各种SQL语句。
2)映射文件的扩展名为*.hbm.xml
3、创建Hibernate配置文件:
1)Hibernate从其配置文件中读取和数据库连接的有关信息,这个文件应该位于应用的classpath下
4、Configuration类(负责管理Hibernate的配置信息):
1)Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、数据库Dialect、数据库连接等(对应hibernate.cfg.xml文件)
2)持久化类与数据表的映射关系(*.hbm.xml文件)
3)创建Configuration的两种方式:
-属性文件(hibernate.properties):暂时不推荐使用
Configuration cfg = new Configuration();
-xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration.configure();
-Configuration的configure方法还支持带参数的访问:
File file = new File(“simpleit.xml”);
Configuration cfg = new Configuration.configure(file);
5、SessionFactory接口
1)针对某个数据库映射关系经过编译后内存镜像,是线程安全的。
2)SessionFactory对象一旦构造完毕,即被赋予特定的配置信息
3)SessionFactory是生成Session的工厂
4)构造SessionFactory很消耗资源,一般情况下,一个应用中只初始化一个SessionFactory对象。
5)Hibernate4新增了一个ServiceRegistry接口,所有基于Hibernate的配置或者服务都必须统一向这个ServiceRegistry注册后才能生效
6)Hibernate4中创建SessionFactory的步骤:
①Configuration configuration = new Configuration.configure(); ②ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); ③SessionFactory session = sessionFactory.buildSessionFactory(serviceRegistry);
6、Session接口
1)Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在Session的管理下才可以进行持久化操作。此对象生命周期很短。
2)Session对象有一个一级缓存。显式执行flush之前,所有的持久化层操作的数据都缓存在Session对象处。相当于JDBC中的Connection
3)持久化类与Session关联起来后就具有持久化的能力
4)Session类的方法:
①取得持久化对象的方法:get() load()
②持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate().delete()
③开启事务:beginTransaction()
④管理Session的方法:isOpen(),flush(),clear(),evict(),close()等
7、Transaction(事务):
1)代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
-Transaction tx = session.benginTransaction();
2)常用方法:
①commit():提交相关联的session实例
②rollback():撤销事务操作
③wasCommitted():检查事务是否提交
8、Hibernate配置文件的两个配置项:
1)hbm2ddl.auto:该属性可帮助程序员实现正常工程,即由java代码生成数据库脚本,进而生成具体的表结构。取值create|update|create-drop|validate
-create:会根据*.hbm.xml文件来生成数据库表,但是每一次运行都会删除上一次的表,重新生成表,哪怕二次没有任何改变。
-create-drop:会根据*.hbm.xml文件生成表,但是SeesionFactory一关闭,表会自动删除
-update:会根据*.hbm.xml文件生成表,但若*.hbm.xml文件和数据库中对应的数据表的表结构不同,Hibernate将更新数据库表结构,但不会删除已有的行和列。(最常使用的属性值)
-validate:会和数据库中的表进行比较。若*.hbm.xml文件中的列在数据表中不存在,则抛出异常。
2)Format_sql:是否将SQL转化为格式良好的SQL,取值true|false
8、Session概述:
1)Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存,更新,删除和加载Java对象的方法。
2)Session具有一个缓存,位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应。Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程被称之为刷新缓存(flush)
3)站在持久化的角度,Hibernate把对象分为4种状态:持久化状态,临时状态,游离状态,删除状态。Session的特定方法能是对象从一个状态转换到另一个状态。
9、Session缓存
1)在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存,只要Session实例没有结束生命周期,且没有清理缓存,则存放在它缓存中的对象也不会结束声明周期
2)Session缓存可减少Hibernate应用程序访问数据库的频率
3)注意:在查询过程中,先会到Session中查看Session缓存中是否存在所要查找的缓存数据。若有,直接将数据返回,同时无需向数据库发送查询语句;若没有,则向数据库发送查询语句,返回数据并进行缓存。
4)flush:使数据库表的记录和Session缓存中的对象的状态保持一致,为了保持一致,则可能会发送对应的SQL语句
①在Transaction的commit()方法中:先调用session的flush方法,在提交事务
②flush()方法会可能会发送SQL语句,但不会提交事务
③注意:在未提交事务或显式的调用session.flush()方法之前,也有可能会进行flush()操作
-执行HQL或者QBC查询,会先进行flush()操作,以得到数据表的最新记录。
-若记录的ID是由底层数据库使用自增方式生成的,则在调用save()方法以后,就会立即发送INSERT语句。因为save方法后,必须保证对象的ID是存在的
-Commit()和flush()方法的区别:flush执行一系列的SQL语句,但不提交事务;commit方法先调用flush()方法,然后提交事务,提交事务意味着对数据库操作永久保存下来。
④refresh():会强制发送SELECT语句,以使Session缓存中对象的状态和数据库表中对应的记录保持一致
10、在Hibernate中设置隔离级别
1)JDBC数据库连接使用数据库系统默认的隔离级别,在Hibernate的配置文件中可以显式的设置隔离级别,每一个隔离级别分别都对应一个整数:
-1.READ UNCOMMITED
-2.READ COMMITED
-4.REPEATABLE READ
-8.SERIALIZEABLE
2)Hibernate通过为Hibernate映射文件指定hibernate.connection.isolation属性来设置事务的隔离级别