前边我们讲了如何开发一个Hibernate的HelloWorld的程序,即首先导入Hibernate必须的jar包和数据库驱动的jar包,然后配置Hibernate的配置文件--hibernate.cfg.xml(注明连接数据库的信息和Hibernate框架的其他的属性信息,如数据库方言,控制台显示SQL,格式化控制台的信息,生成数据库表的策略,加载不同类的Mapping映射文件等),创造一个持久化的类,针对这个持久化的类来创建一个hbm.xml的Mapping的映射文件*.hbm.xml。最后我们使用Hibernate提供的API来编写访问数据的代码。
今天我们来详细讲解一下这个HelloWorld程序的各个部分的内容。
1.创建一个用于持久化的Java类
① 必须有一个无参的构造器用于反射创建对象。因为在持久化类对应的hbm.xml文件中声明了class和table的映射关系,而class使用的是全类名,而一提到全类名,我们就应该想到反射创建对象;而且我们在使用Hibernate的API访问数据库时,即使我们没有使用session的操作数据库的方法,也会在数据库中根据hbm.xml映射文件而创建一个持久化类对应的表格,说明通过反射创建了对象。
② 为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans风格的属性实行持久化。
③ 提供一个标识属性。通常用来映射为数据库的主键。
④ 使用非Final的类。运行时生成代理是Hibernate的一个重要功能,若持久化的类没有实现任何的接口,Hibernate用CGLIB生成代理,若用Final类,则无法生成CGLIB代理。
&&&Hibernate是一个轻量级(非侵入)的框架,因为我们在定义类的时候不需要继承任何的Hibernate的类或者实现任何Hibernate的接口,即Hibernate不要求被持久化的类继承任何的类或者实现任何的接口,保证了代码不被污染。
⑤ 重写equals和hashcode方法。如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。
2.对象关系映射文件
①Hibernate采用XML格式的文件来指定对象和关系数据之间的映射,在运行时Hibernate将根据这个映射文件来生成各种SQL语句。
② 映射文件的扩展名为.hbm.xml
3.Hibernate的配置文件
默认名称为hiberante.cfg.xml。指定了连接数据库的信息,Hibernate的其他信息和加载的hbm.xml文件。
①format_sql:取值true/fause 指定是否对输出的SQL语句进行格式化
② show_sql:取值true/fause 指定程序运行是否在控制台输出SQL语句
③hbm2ddl.auto:取值update/create/create-drop/validate 指定程序运行时是否在数据库自动生成数据表
- create:会根据.hbm.xml文件生成数据表,但是每次运行完会删除上一次的表,重新生成表,哪怕二次没有任何改变。
- create-drop:会根据.hbm.xml文件生成表,但是SessionFactory一关闭(项目关闭),表就自动删除。
- update:最常用的属性值,也会根据.hbm.xml文件生成表,但若.hbm.xml文件和数据中对应的数据表的表结构不同,Hibernate将更新数据表结构,但不会删除已有的行和列。
- validate:会和数据库中的表进行比较,若.hbm.xml文件中的列在数据表中不存在,则抛出异常。
4.如何通过Hibernate提供的API访问数据库
① configuration对象
这个对象相当代表了hibernate.cfg.xml这个配置文件。通常用Configuration c = new Configuration().configure()来获取;若Hibernate的配置文件时hibernate.properties我们使用Configuration c = new Configuration()来获取配置文件对象。
② SessionFactory接口
这个对象是Hibernate针对单个数据库映射的关系经过编译后的内存镜像,因为是针对单个数据库所以是线程安全的。
SessionFactory对象一旦被建立,就被赋予了独特的不可更改的Hibernate的配置信息。
SessioinFactory的功能是建立Session的工厂。
Hibernate4新增了一个ServiceRegistroy的接口,所有基于HIbernate的配置或者服务都必须向这个ServiceRegistry注册才可以生效
SessionFactory sf= new Configuration().configure().buildSessionFactory();
③ Session接口
这个接口是程序与数据库之间操作的单线程的接口,是Hibernate运行的中心。
所有持久化的类都必须在Session的管理下才可以进行持久化的操作。
这个对象的生命周期很短。
Session对象有一个一级缓存,在显式执行flush()方法之前,所有持久层的操作的数据都会缓存在这个Session对象的缓存区中。
Session类的方法:
取得持久化对象的方法:get()load()
持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
开启事务:beginTransaction().
管理Session的方法:isOpen(),fluse(),clean(),evict(),close()等
Session s = sf.openSession();
④ Transaction事务对象
代表一个原子操作,具有数据库事务的概念。
在Hibernate中,所有的数据库的操作都应该包含在事务操作中,即使是只读的操作。否则若是不开启事务,那么在Hibernate中,针对数据库的操作不会保存在数据库中,是失败的。
Transaction tx=session.beginTransaction();
常用方法:
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交