框架的诞生必然是为了解决某一问题,要对Hibernate的身世有所了解,知道它的优点、作用,能够干什么,不能够干什么,这然才算是掌握了Hibernate.
典型的B/S三层架构,这个都不陌生:
为什么要把Dao单独作为一个层?这样设计肯定是有原因的.底层数据库的实现不同,Dao的实现也不尽相同,可能一个Dao接口下有很多个实现,比如MysqlDaoImpl或者OracleDaoImpl等,这样写很不方便,很麻烦,而且就算用dbUtils这样的框架简化开发,也有一些问题解决不了,比如要把一个域对象映射到一张表里面去,如果这个对象的属性名或者表的字段名发生了更改,就全部都要改,很不方便,而Hibernate就能解决这样的问题,它不用管底层数据库的实现是什么,只需要告诉它所说的方言并通过域对象生成SQL语句,通过配置文件映射到表,为业务逻辑层提供了面向对象的API,对数据访问进一步的封装.所以Hibernate的特点如下:
代码重用性高,可完成所有的数据访问操作
能够支持多种数据库平台
具有相对独立的性,当持久层变化时,不会影响上层实现
在实际应用中,对象的映射文件后缀名是.hbm.xml,Hibernate的主配置文件名为hibernate.cfg.xml.
映射文件描述对象与表之间的关系,映射文件并没有创建实质性的东西,只有当hibernate的Configuration类将配置文件读到流中,创建SessionFactory,SessionFactory才会检查表的结构,然后根据主配置文件里的hbm2ddl.auto的取值,作相应的反应.配置映射文件的时候,需要思考,需要什么信息,且只需要配置hibernate猜不到的信息,比如配置了对象的属性ID为主键,如果表中的主键列的列名为ID,则可以不用配置,不同的集合需要配置不同的属性:
Set
<set> 属性名、集合表、集合外键、存放元素的列
List
<list> 属性名、集合表、集合外键、存放元素的列、表示索引的列
Bag
<bag> 属性名、集合表、集合外键、存放元素的列
Map
<map> 属性名、集合表、集合外键、存放元素的列、表示key的列
数组
<array> 属性名、集合表、集合外键、存放元素的列、表示索引的列
集合有懒加载,是配置集合的元素中的lazy属性,可取的值有:true,false,extra.默认值为true,为懒加载,就是当你用的时候才加载.extra就是增强的"超级懒加载",此时大多数操作都不会初始化集合类,只有当程序第一次访问集合属性的iterator()方法时,才会导致集合类的初始化,或者是有时候只想看集合的长度或者是不是空的,不关心集合中存放着什么数据,如果这个时候把集合的全部数据都读取出来,就很没有必要,于是就有第二个作用:当程序第一次访问集合属性的 size(), contains() 和 isEmpty() 方法时, Hibernate 不会初始化集合类的实例, 仅通过特定的 select 语句查询必要的信息.需要注意的是只有集合的lazy属性才有extra的取值.普通的值映射如下:
<!-- package属性,表示当前配置中所写的类名如果没有包名,则默认是这个包中的。 --> |
<hibernate-mapping> |
<!--class元素表明哪个实体对应哪张表,一个class元素代表一个实体的映射
|
name:指定实体(类的全限定名)
|
table:指定实体对应的表,可以不写,不写时代表表名和对象的简单名称一致
|
mutable:默认为true,表明该类的实例是可变的或者不可变的
|
dynamic-update:默认为 false,用于 UPDATE 的 SQL 将会在运行时动态生成,并且只更新那些改变过的字段
|
dynamic-insert:默认为 false,用于 INSERT 的 SQL 将会在运行时动态生成,并且只包含那些非空值字段
|
--> |
<class name="..domain.Person" table="person"> |
<!-- 主键映射 必须要有 --> |
<id name="id" type="int"> |
<!-- 主键的值生成器,有多种生成策略 --> |
<generator class="identity"></generator> |
</id> |
<!-- 值映射
|
name:代表实体的属性名
|
type:值类型,在数据库中一个列可以存放的属性,例:int, varchar, date)
|
not-null:非空约束
|
--> |
<property name="name" type="string" length="12" not-null="true" /> |
|
<property name="birthday" type="date" /> |
|
<!-- 集合映射
|
bag map set list array对应不同的标签
|
--> |
<list name="interest" table="interestList"> |
<key column="interestID"></key> |
<!-- List需要顺序 --> |
<list-index column="index_"></list-index> |
<!-- 元素列 --> |
<element column="interest" type="string" length="22"></element> |
</list> |
</class> |
</hibernate-mapping> |
|
主键值的生成策略虽然有很多,但是只有当<generator>元素的class属性的值为assigned策略时才需要自己指定主键值,其他的都由Hibernate指定,自己不需要指定,指定了也没用还需要注意一点的就是increment,它是由Hibernate来维护的自增长,有并发问题,除了这种自增长,还有几种方式,native会根据数据库的能力选择 identity
、sequence
或者hilo
中的一个,如果是mysql就会选择identity,由数据库维护,不会有并发问题.如果生成策略是hilo(高/低算法),需要额外配置几个参数.主键的类型分为两种:自然主键和代理主键.自然主键是在数据库表中把具有业务逻辑含义的字段作为主键,比如有客户的姓名,把客户的姓名当作主键,就是自然主键;代理主键就是采用一个与当前表中逻辑信息无关的字段作为其主键,比如在一张表中插入一列与业务数据毫无关系的数据.
主配置文件可以包含三类信息的配置:数据库连接信息、其他配置和声明映射文件.例如:
<hibernate-configuration> |
<session-factory> |
<!-- 数据库连接信息 --> |
<property name="hibernate.connection.username">root</property> |
<property name="hibernate.connection.password">root</property> |
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> |
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> |
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> |
|
<!-- 其他配置 --> |
<property name="show_sql">true</property>
|
<!-- 自动生成表结构,可选择的值有:
|
create:每次启动时创建表结构,在建表前会先执行删除表的语句,以保证创建成功。
|
update:每次启动时检测一下,如果表结构没有,则创建,不一样,则更新。
|
create-drop: 每次启动时创建表结构,退出前删除表结构
|
validate: 每次启动时检测一下,如果表结构不一样,就报错
但是hbm2ddl.auto属性的配置一般在新增时有效,更新时无效.需要注意一下.
|
--> |
<property name="hbm2ddl.auto">update</property> |
|
<!-- 声明映射文件 --> |
<mapping resource="../../domain/Person.hbm.xml" /> |
|
</session-factory> |
</hibernate-configuration> |
主配置文件相对简单,以后数据库的连接信息也不用放在主配置文件中.主配置文件里面配置了一个sessionFactory,Hibernate把一次数据库的访问当作是会话来看待,我们就需要在程序中获得会话,就要利用到sessionFactory,sessionFactory由主配置文件来描述,我们就先要读取调查主配置文件,然后由Hibernate来产生sessionFactory:
private static SessionFactory sessionFactory = new Configuration() |
.configure() |
.buildSessionFactory(); |
读取主配置文件的方法有多种,都是Configuration类的configure()方法重载的版本,最简单的就是将主配置文件命名为hibernate.cfg.xml,原因如下:
public Configuration configure() throws HibernateException { |
configure( "/hibernate.cfg.xml" ); |
return this; |
} |
这是源码.然后我们在主配置文件中利用<mapping>标签声明了映射文件,这个标签会找到指定的类,然后把相应的映射文件加载进来,我们还有另外一种方法加载映射文件:
private static SessionFactory sessionFactory = new Configuration() |
.configure() |
.addClass(Person.class) |
.buildSessionFactory(); |
只是比之前的代码多了一行,addClass()方法的返回值仍是Configuration对象,意味着如果你还有映射文件没有加载进来,仍可能继续接着写,那么它是如何找到映射文件的呢?其实很简单,我们一样可以写出来:
public Configuration addClass(Class persistentClass) throws MappingException { |
String mappingResourceName = persistentClass.getName().replace( '.', '/' ) + ".hbm.xml"; |
log.info( "Reading mappings from resource: " + mappingResourceName ); |
return addResource( mappingResourceName, persistentClass.getClassLoader() ); |
} |
这是它的源码,先得到类的全限定名,再把点替换把/,就得到了路径,再连接后缀,就行了,方法本身很简单,我们也要掌握它的思想,也就是方法调用链.
分享到:
相关推荐
总结起来,Hibernate 3.6 作为一款成熟的 ORM 框架,通过对象化的数据库操作方式,极大地提升了 Java 应用的开发效率,同时也提供了丰富的功能和优化选项,帮助开发者更好地应对复杂的数据访问需求。
《Hibernate 3.6 中文 CHM》是一个针对Hibernate 3.6版本的详细使用指南,旨在帮助开发者理解和掌握这个强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个重要工具,它允许程序员以面向对象的方式处理...
Hibernate 3.6 是一个流行的Java对象关系映射(ORM)框架的重要版本,它极大地简化了数据库操作,将复杂的SQL语句与Java对象之间建立了桥梁。在这个版本中,Hibernate提供了许多增强的功能和优化,旨在提高开发效率...
`hibernate3.6.jar` 是Hibernate 3.6版本的核心库,包含了实现ORM功能所需的类和接口。 在这个版本中,Hibernate 提供了以下主要功能和知识点: 1. **对象关系映射(ORM)**:Hibernate 提供了一种将Java对象与...
接下来,我们将深入学习如何使用Hibernate 3.6进行开发: 1. **环境搭建**: 首先,你需要在项目中引入Hibernate的JAR包,以及相应的数据库驱动。然后,配置hibernate.cfg.xml文件,确保数据库连接正确。 2. **创建...
Hibernate 3.6 Final所有的jar包,以及Hibernate Tools 中的hibernate-tools.jar 和 freemarker.jar 。 本jar包用于使用hibernate-tools生成POJO所需要的依赖库
标题"hibernate3.6参考文档中英文"表明这是一个关于Hibernate 3.6版本的综合参考资料,包含中文和英文两个版本。Hibernate是一个流行的Java ORM(对象关系映射)框架,它使得Java开发者可以更加便捷地在数据库上操作...
在这个“hibernate3.6所有包”压缩文件中,包含了Hibernate 3.6版本的所有核心组件和依赖库。这个版本在当时是一个重要的里程碑,因为它引入了许多改进和新特性。 1. **Hibernate核心**:这是Hibernate框架的基础,...
在这个“hibernate3.6相关jar包”中,我们很可能找到了Hibernate 3.6版本所需的一系列库文件,这些文件对于理解和使用Hibernate 3.6版本至关重要。 首先,Hibernate 3.6是一个相对成熟的版本,发布于2010年,它在...
下面将详细介绍如何整合Struts2.2.1、Hibernate3.6和Spring3.0.5。 首先,确保准备好所有必要的库文件,包括: 1. Struts2的struts2-2.2.1-all.zip 2. Hibernate的hibernate-distribution-3.6.0.Final-dist.zip 3. ...
**Hibernate 3.6** 是一个流行的对象关系映射(ORM)工具,它允许开发人员使用面向对象的方式来操作数据库。通过Hibernate,可以将Java对象映射到数据库表,简化了数据访问层的编写。3.6版本引入了一些改进,包括...
【hibernate3.6.X】是一个流行的Java持久化框架,它实现了ORM(对象关系映射)技术,使得开发者可以通过面向对象的方式处理数据库操作,从而降低了数据库编程的复杂性。在传统的三层架构中,hibernate常被用作数据...
Hibernate 3.6作为一款广泛应用的Java对象关系映射(ORM)框架,其源代码是开发者深入理解ORM机制、优化数据库操作的重要参考资料。该源码包“hibernate-core-3.6.0.Final.src.tar”包含了Hibernate的核心模块,让...
Hibernate 3.6是其一个稳定且广泛使用的版本。本文将围绕Hibernate 3.6的基本jar包进行深入探讨,了解每个组件的作用及其在项目中的重要性。 1. **hibernate3.jar**:这是Hibernate的核心库,包含了所有主要的API和...
**基于Hibernate 3.6的JPA例子详解** 在Java世界中,ORM(Object-Relational Mapping)框架如Hibernate已经成为数据库操作的标准工具。本篇将深入探讨如何利用Hibernate 3.6版本进行JPA(Java Persistence API)...
总的来说,《Hibernate 3.6中文文档》是一本全面而深入的学习资料,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的知识,提高你在Java ORM领域的专业技能。通过学习这份文档,你将能够熟练地运用Hibernate...
Hibernate3.6 api_en_US,Hibernate3.6最新英文版 chm格式api帮助文档
这个压缩包“Hibernate 3.6 API 和帮助文档 打包一起”包含了关于Hibernate 3.6版本的重要资源,对于学习和使用该版本的Hibernate非常有帮助。 API文档是开发人员理解任何库或框架的关键,Hibernate 3.6的API文档...