一个Hibernate项目核心配置文件主要分为以下三个方面:1、配置文件hibernate.cfg.xml;2、配置文件*.hbm.xml,此文件一般包括映射文件的结构以及各种属性的映射方式;3、Hibernate关联关系映射。
1、配置文件hibernate.cfg.xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-configuration 3 PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0 //EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 配置数据库JDBC驱动 --> 8 <property name="hibernate.connection.driver_class"> 9 com.mysql.jdbc.Driver 10 </property> 11 <!-- 配置数据库连接URL --> 12 <property name="hibernate.connection.url"> 13 jdbc:mysql://localhost:3306/mysqldb 14 </property> 15 <!-- 配置数据库用户名 --> 16 <property name="hibernate.connection.username">root</property> 17 <!-- 配置数据库密码 --> 18 <property name="hibernate.connection.password">root</property> 19 <!-- 输出运行时生成的SQL语句 --> 20 <property name="show_sql">true</property> 21 <property name="hibernate.hbm2ddl.auto">update</property> 22 <property name="hibernate.cache.use_second_level_cache"> 23 true 24 </property> 25 <property name="hibernate.cache.provider_class"> 26 org.hibernate.cache.EhCacheProvider 27 </property> 28 <!-- 配置数据库方言 --> 29 <property name="hibernate.dialect"> 30 org.hibernate.dialect.MySQLDialect 31 </property> 32 <!-- 列出所有的映射文件 --> 33 <mapping resource="org/hibernate/entity/User.hbm.xml" /> 34 </session-factory> 35 </hibernate-configuration>
hibernate.cache.use_second_level_cache 是hibernate的二级缓存属性。Hibernate共有两级缓存,第一级缓存是Session级的缓存,它是事务范围的缓存,可以由Hibernate自动管理。第二级缓存是由SessionFactory管理的进程级缓存,可以在配置文件中进行配置和更改,而且可以动态加载和卸载。其他相关属性,需要查找相关资料,这里不一一列举。
2、映射文件*.hbm.xml
映射文件用于向Hibernate提供将对象持久化到关系数据库中的相关信息,每个Hibernate映射文件结构基本相同,根元素都为hibernate-mapping元素,Hibernate-mapping元素下面又可以包含多个class子元素,每个子元素都对应着一个持久化的映射。
hibernate映射文件里有很多元素,元素里又包含不同的属性,这里只列举一部分:
(1)Hibernate-mapping元素。该元素定义了XML配置文件的基本属性。
I、default-access = "field | property |ClassName " :指定Hibernate用来访问属性时所使用的策略,可以通过实现PropertyAccessor接口来自定义属性访问策略。该属性可选,默认值为Property。当为property时,使用getter和setter方法访问成员变量,当值为"field"时,使用反射访问成员变量。
II、default-lazy: 指定是否采用延迟加载策略,改属性默认值为true,即采用延迟加载策略。
(2)class元素。用来声明一个持久化类,通过它可以定义Java持久化类与数据表之间的映射关系。<class>元素中包含的主要属性有:
I、name属性:持久化类或者接口的全限定名。
II、table属性:持久化类对应的数据库表名。
(3)Id元素。此标识属性映射到持久化对应的数据库表中的主键列。
此元素里最重要的一个是它包含了一个可选的<generator>子元素。generator元素指定了主键的生成方式。对于不同的数据库和业务,其主键生成策略往往不同,Hibernate提供了几个内置的主键生成器策略:
increment: 用于long、short或int类型主键生成唯一的标识。只有当没有其他进程想同一张表中插入数据是才可用,不能再集群环境下使用
identity : 采用底层数据库本身提供的主键生成机制,改生成器要求在数据库中把主键定义为自增长(identity)类型,返回的标识符类型为long、int或short。
sequence: 在支持序列(sequence)的数据库中可以使用该生成策略创建唯一标识。返回的标识符类型为long、short或int
hilo : 使用一个高/低位算法高效地生成long、short和int类型的标识符。
native : 依据底层数据库的能力在identity、sequence、hilo3种生成器中选择一种。
assigned : 让应用程序在save()方法调用前为对象分配一个标识符。如果不指定id 元素的generator属性,则默认使用该主键生成器策略。
foreign : 使用另一个关联对象的标识属性。常用在1-1主键关联映射中。
(4)property元素映射普通属性
<property name="username" column = "NAME" type="java.lang.String" />
(5)映射集合属性
根据java集合的特点,Hibernate中可以分为如下几种集合类映射:
<set> : 无序,通常用于一对多或者多对多关联关系映射。
<list> : 有序,必须要有一个索引字段。
<map> : 无序,必须要有一个映射关键字字段
<bag> : 有序,必须要有一个索引字段
<array> : 有序,必须要有一个索引字段
3、Hibernate关联关系映射
Hibernate关联关系可以分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多四种关联方式。多向关联可以分为一对一、一对多、多对多3种关联方式。
(1)单向的一对一关联。其又可以分为两类,分别是通过主键关联和通过外键关联。
I、通过主键关联。一对一的关联可以通过主键关联,但基于主键关联的持久化类(其对应的数据表称为从表)却不能拥有自己的主键生成策略,这是因为从表的主键必须由关联类(其对应的数据表称为主表)来生成。此外,要在被关联的持久化类的映射文件中添加one-to-one元素来指定关联属性,并为one-to-one元素指定constrained属性值为true,此表表明从表的主键由关联类生成。
II、通过外键关联。通过外键关联时两张数据表的主键是不同的,通过在一张表中添加外键列来保持一对一的关系,配置外键关联关系时需要使用many-to-one元素,因为通过外键关联的一对一关系,本质上时一对多关系的特例,因此,只需在many-to-one元素中增加unique=”true"属性即可,这相当于在多的一端增加了唯一性的约束
(2)单向的一对多关联。单向的一对多关联映射关系主要是通过外键来关联的,一对多的关联映射是在表示“多”的一方的数据表中增加一个外键,并由“一”的一方指向“多”的一方。单向一对多关联的持久化类里需要包含一个集合属性,在“一”的一方访问“多”的一方时,“多”的一方将以集合的形式体现。
(3)单向的多对一关联。单向的多对一关联映射也是通过外键来关联的。多对一的映射方式类似一对多的映射方式,不过它的映射关系是由“多”的一方指向“一”的一方。在表示“多”的一方的数据表中增加一个外键来指向表示“一”的一方数据表,“一”的一方作为主表,“多”的一方作为从表。
(4)单向的多对多关联。多对多关系在数据库中是比较常见的,它利用中间表将两个主表关联起来,中间表的作用是将两张表的主键作为其外键,通过外键建立者两张表之间的映射关系。
(5)双向的一对一关联
I、通过主键关联。通过主键关联的双向一对一映射,在需要一方的配置文件中将主键生成策略配置成foreign,即表示需要根据另一方的主键来生成自己的主键,而该实体本身不具有自己的主键生成策略。一对一主键映射在双向的一对一映射中应用比较多。
II、通过外键关联的双向一对一映射,外键可以放在任意一方。在存放外键一方的映射文件中,需要添加many-to-one元素,并为该元素添加unique=“true”属性,而另外一方的配置文件中需要添加one-to-one元素,并使用其name属性来指定关联属性名。此时,存放外键的一方对应的数据表为从表,而另一方对应的数据表变为主表。
(6)双向的一对多关联。双向的一对多关联在“多”的一方要增加新属性以引用关联实体,在“一”的一方则增加集合属性,该集合中包含“多”一方的关联实体。双向的一对多关联和双向的多对一关联实际上是完全相同的。
(7)双向的多对多关联。双向的多对多关联,两端都要添加Set集合属性。要实现双向多对多关联,必须在使用中间表来实现两个实体间的关联关系。