前边我们讲了如何开发一个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映射文件二创建一个持久化类对应的表格,说明通过反射创建了对象。
② 必须有setter/getter方法。
③ 提供一个标识属性。通常用来映射为数据库的主键。
④ 使用非Final的类。运行时生成代理是Hibernate的一个重要功能,若持久化的类没有实现任何的接口,Hibernate用CGLIB生成代理,若用Final类,则无法生成CGLIB代理。
&&&Hibernate是一个轻量级(非侵入)的框架,因为我们在定义类的时候不需要继承任何的Hibernate的类或者实现任何Hibernate的接口,即Hibernate不要求被持久化的类继承任何的类或者实现任何的接口,保证了代码不被污染。
⑤ 重写equals和hashcode方法。若需要放入集合中,就必须重写这两个方法。
2.对象关系映射文件
Hibernate使用*.hbm.xml的文件来映射类与表之间的关系:类——表,属性——列名。
3.Hibernate的配置文件
默认名称为hiberante.cfg.xml。指定了连接数据库的信息,Hibernate的其他信息和加载的hbm.xml文件。
需要注意的是其中一个叫做hbm2dll.auo的属性的配置,有四种分别是:
create:表示数据库会先检查是否存在配置中的表格,存在则删除,不存在则新建一个。
create-drop:和create类似,不同的是在sessionFactory关闭之后,创建的表就会自动删除
update:最常用,也会根据hbm.xml文件生成表格,但若是hbm.xml中的数据结构和数据库中的数据结构不相符的话,只会添加,而不会删除。
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注册才可以生效。
③ Session接口
这个接口是程序与数据库之间操作的单线程的接口,是Hibernate运行的中心。
所有持久化的类都必须在Session的管理下才可以进行持久化的操作。
这个对象的生命周期很短。
Session对象有一个一级缓存,在显式执行flush()方法之前,所有持久层的操作的数据都会缓存在这个Session对象的缓存区中。
④ Transaction事务对象
代表一个原子操作,具有数据库事务的概念。在Hibernate中,所有的数据库的操作都应该包含在事务操作中,即使是只读的操作。否则若是不开启事务,那么在Hibernate中,针对数据库的操作不会保存在数据库中,是失败的。