资源描述
第15章Hibernate配置和会话Hibernate的配置包括两个重要部分,一个是Hibernate的配置文件hibernate.cfg.xml,一个是实体类的映射文件。本章我们将对这两个文件的配置进行详细介绍以及如何使用Annotations配置映射,最后还将介绍Hibernate的3种对象状态及Session的各种方法及应用。15.1 传统方式配置HibernateHibernate的配置主要有两种方式:传统的配置方法以及使用Annotations进行配置的方法。首先我们先来学习传统的配置方式。15.1.1 配置Hibernate在使用Hibernate进行持久化之前,必须对Hibernate进行一系列配置,如数据库连接URL、数据库用户名和密码以及映射文件路径等。对于Hibernate的配置,最常用的就是采用XML格式的方法进行配置。Hibernate默认的配置文件为hibernate.cfg.xml,其包含的配置属性如表15.1所示。属性名属性名描述描述hibernate.dialectHibernate方言所对应的类名hibernate.show_sql设置是否在控制台输出SQL语句hibernate.connection.url设置数据库连接URLhibernate.connection.username设置数据库用户名hibernate.connection.password设置数据库密码hibernate.connection.driver_class设置数据库连接驱动类hibernate.default_schema生成SQL时,schema/tablespace的全限定名15.1.1 配置Hibernate注意:使用XML文件配置Hibernate时,可以将属性名简写,如将hibernate.show_sql直接写为show_sql。15.1.2 配置映射文件映射文件是持久化操作中的一个重点,它是数据库表和实体类之间的连接枢纽。通过映射文件,Hibernate就能知道实体类和那个数据库表相对应。映射文件也是采用XML文档规范,这样设计可以使其非常易读,而且容易修改。下面我们就对其包含的各种元素分别做一简要介绍。1.元素映射文件的根节点为,该节点包含一系列的可选属性,如schema和catalog属性。schema属性指定了数据库表所在的schema名称。注意:一个映射文件中只允许有一个元素。属性名属性名必必选默默认值描述描述schema否无指定数据库schema的名称catalog否无指定数据库catalog的名称default-cascade否none指定默认的级联风格default-access否property指定访问所有属性的策略default-lazy否true指定默认加载风格auto-import否true指定是否可以查询非全限定的类名package否无指定包前缀,若没有指定全限定的类名,将使用这个作为包名2.元素元素用来配置一个实体类与一个数据库表的关联。其中name属性用来指定实体类的名称,table属性用来指定数据库表的名称。元素的常用属性如表15.3所示。注意:元素下可以由多个元素,但是一般推荐值添加一个。即一个实体类对应一个映射文件。属性名属性名必必选默默认值描述描述name否无指定完全路径类名table否无指定数据库表名mutable否true指定类的实例是否可变proxy否无指定代理类接口,为延迟加载提供支持lazy否true指定是否使用延迟加载dynamic-update否false指定生成Update SQL时是否仅包含发生变动的字段dynamic-insert否false指定生成Insert SQL时,是否仅包含非空字段3.元素每一个实体类中都包含一个唯一的标识,元素能够定义该属性和数据库表中的主键字段的映射。元素包括的常用属性如表15.4所示。属性名属性名必必选默默认值描述描述name否无指定标识属性的名称,如果不指定,表示这个类没有标识属性type否无指定标识属性的Hibernate类型column否无指定数据库表中主键字段的名称unsaved-value否无指定该实例是刚创建的,尚未进行保存access否property指定Hibernate用来访问属性值的策略4.元素实体类的标识和数据库表的主键映射完成后,还需要为实体类的其他属性和数据库的其他字段进行映射,这个时候就需要使用到元素。元素的常用属性如表15.5所示。属性名属性名必必选默默认值描述描述name否无指定标识属性的名称,如果不指定,表示这个类没有标识属性type否无指定标识属性的Hibernate类型column否无指定数据库表中主键字段的名称access否property指定Hibernate用来访问属性值的策略not-null否true指定属性是否允许为空generated否never指定属性值是否由数据库生成15.2 使用Annotations配置映射在JDK 5.0之后出现了一种新的注释技术Annotations,而Hibernate也在其3.0之后的版本中添加了对Annotations的支持。通过在实体类中添加Annotations注释,可以达到替代映射文件的效果。15.2.1 使用Entity注释实体类Entity注释用来将一个普通的JavaBean标注为实体类。Entity注释由一个可选的name属性,用来设置属性名。并不是所有的JavaBean都能被标注为实体类,必须要满足如图15.7所示的3个条件。注意:使用Entity注释实体类,一定要使用import语句引入javax.persistence.Entity类,该类为Entity注释依赖类。15.2.2 使用Table注释实体类Table注释用来对实体类进行进一步注释,用来配置实体类到数据库表映射的更详细的信息。Table注释包含的属性信息如表15.6所示。注意:使用Table注释实体类,一定要使用import语句引入javax.persistence.Table类,该类为Table注释依赖类。属性名属性名属性描述属性描述catalog用来设置数据库名name用来设置数据库表名schema用来设置数据库表的所有者名称uniqueConstraints用来设置数据库表的约束15.2.3 使用Id注释实体类标识Id注释用来对实体类的标识进行配置。一个实体类一般只有一个标识,所以一个实体类中只出现一个Id注释。注意:使用Id注释实体类标识,一定要使用import语句引入javax.persistence.Id类,该类为Id注释依赖类。15.2.4 使用GenerateValue注释覆盖标识的默认访问策略使用Id注释实体类标识时将采用Hibernate的默认访问策略,这时可以使用GenerateValue注释覆盖标识的默认访问策略。GenerateValue注释包括两个属性,即使用generator属性指定标识生成器名,使用strategy属性指定标识生成策略。strategy属性的属性值为一个枚举类型,其中包含了4个枚举值,如表15.7所示。枚枚举值描述描述说明明javax.persistence.GeneratedType.AUTOstrategy属性默认值,表示自动确定表示的类型javax.persistence.GeneratedType.IDENTITY用来表示由数据库自动设置标识的值,如自动递增字段javax.persistence.GeneratedType.SEQUENTITY用来表示标识为SEQUENTITY类型javax.persistence.GeneratedType.TABLE用来保证另一个使用该标识的表记录的唯一性15.2.5 使用GenericGenerator注释生成标识生成器前面我们介绍了如何使用GenerateValue注释的strategy属性来指定生成策略,但是这些生成策略明显不能满足。这时可以使用GenericGenerator注释产生标识生成器,然后通过GenerateValue注释的generator属性来制定生成器的name属性,这样就可以采用指定的生成器生成标识。GenericGenerator注释包含3个属性,其属性说明如表15.8所示。属性名属性名属性描述属性描述name用来设置标识生成器名parameters用来设置标识生成器所需的参数strategy用来设置Hibernate内置的生成策略15.2.6 使用Column注释实体类非标识属性一个实体类除了有标识,一般还会有许多其他属性,这时可以使用Column注释这些属性。Column注释最常用的属性为name属性,该属性用来设置数据库表中的字段名。15.2.7 自定义AnnotationSessionFactory类来获得Session对象前面我们介绍了如何使用Annotation注释来完成实体类到数据库表的映射,这时还有一点需要特别注意。在以前获得SessionFactory对象是通过调用Configuration对象来实现的,但是这种方式不支持Annotations注释映射。要支持Annotations就必须使用AnnotationConfiguration类了。15.2.8 测试Annotations注释是否成功完成映射通过AnnotationSessionFactory可以加载Annotations注释方式的映射。通过调用Session对象的各种方法就可以完成各类数据库操作,如查询记录、添加记录等。在创建测试类之前,首先同样需要在Hibernate的配置文件hibernate.cfg.xml中添加映射信息。同映射文件配置映射不同,这里需要指定class属性为需要映射的实体类。具体配置方法如图15.15所示。15.2.8 测试Annotations注释是否成功完成映射完成如上步骤后,映射信息就已经全部完成了,下面我们就来创建一个测试类来测试使用Annotations注释是否能成功完成映射。我们首先打开MySQL数据库并在名为mysqltest的数据库中建立一个tb_employee表,并在表中按照前面所述的属性建立一条数据信息。15.3 会话(Session)的应用Hibernate提供了一个会话类Session,可以通过SessionFactory获得Session实例对象。通过调用Session对象的个方法即可完成数据库操作,如通过save方法来插入记录,通过load方法按标识取出记录,通过delete方法删除记录等。15.3.1 Hibernate对象状态一个实体类的实例可能处于3种不同的状态中的一种。这3种状态分别为瞬时状态、持久状态和托管状态。下面我们就来看这3种状态的详细说明,如图15.16所示。15.3.1 Hibernate对象状态我们总结这3中转台,再结合个状态的转换方法就可以得到其状态转换图,如图15.17所示。15.3.2 使用save方法持久化对象使用new关键字创建的对象并没有保存到数据库中,这时的对象为瞬时状态。通过Session对象的save方法能够将其转换成持久状态,并同时在数据库表中添加相应记录。save方法有两种重载方式,如图15.18所示。15.3.3 使用load方法装载对象如果知道某个对象的持久化标识,就可以使用Session对象的load方法从数据库中装载数据,使用load方法装载的对象是持久状态的。15.3.4 使用refresh方法刷新对象使用refresh方法能够根据数据库中的数据来刷新持久对象中的属性值。refresh方法有两种重载方法,如图15.23所示。15.3.5 使用delete方法删除对象可以使用Session对象的delete方法来删除数据库中的记录。delete方法有两个重载方式,如图15.26所示。15.4 小结本章主要讲述了Hibernate的配置和会话方面的知识,熟练掌握Hibernate的配置和会话是使用Hibernate操纵数据库的基础,也是学习高级Hibernate技术的基础。本章的重点内容是掌握使用Annotations配置映射的方法,难点内容是理解会话(Session)的应用的具体方法。希望读者在学习时多加练习,争取掌握。
展开阅读全文