`
junli0411
  • 浏览: 139733 次
  • 来自: ...
社区版块
存档分类
最新评论

hibernate技术

阅读更多
1. hibernate核心接口
在项目种使用Hibernate框架,非常关键的一点就是要了解Hibernate的核心接口。Hibernate 接口位于业务层和持久化层。

图1 Hibernate核心接口的层次架构关系

   Hibernate的核心接口一共有5个,分别为:Session、 SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口, 不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五的核心接口分别加以介绍。

  • Session接口: Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是 Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这 个术语时,其实指的是 Hibernate中的session,而以后会将HttpSesion对象称为用户session。
  • SessionFactory 接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
  • Configuration 接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在 Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
  • Transaction接口:Transaction接口负责事务相关的操作。它是可选的,可发人员也可以设计编写自己的底层事务处理代码。
  • Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
/**

 简单应用

        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();
        User user = new User();
           
        user.setUsername("starxing");
        user.setEmail("star_xing@126.com");
        user.setPassword("starixng");
        session.save(user);
        tx.commit();
        session.close();
**/
2. Hibernate 的配置文件应用。

2.1 配置文件中映射元素详解
对象关系的映射是用一个XML文档来说明的。映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等。下面从一个映射的例子开始讲解映射元素,映射文件的代码如下。
<?xml version="1.0"?>
<!--
所有的XML映射文件都需要定义如下所示的DOCTYPE。
Hibernate会先在它的类路径(classptah)中搜索DTD文件。
-->
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 <!--
hibernate-mapping有几个可选的属性:
schema属性指明了这个映射的表所在的schema名称。
default-cascade属性指定了默认的级联风格 可取值有 none、save、update。
auto-import属性默认让我们在查询语言中可以使用非全限定名的类名 可取值有 true、false。
package属性指定一个包前缀。
-->
<hibernate-mapping  schema="schemaName"  default-cascade="none"
    auto-import="true"   package="test">
        <!--用class元素来定义一个持久化类 -->
        <class name="People"  table="person">              
                <!-- id元素定义了属性到数据库表主键字段的映射。-->
                <id name="id">
                        <!-- 用来为该持久化类的实例生成唯一的标识 -->
                        <generator class="native"/>
                </id>
<!-- discriminator识别器 是一种定义继承关系的映射方法-->
                <discriminator column="subclass" type="character"/>
               <!-- property元素为类声明了一个持久化的,JavaBean风格的属性-->
               <property name="name" type="string">
                      <column name="name" length="64" not-null="true" />
               </property>
               <property name="sex"
               not-null="true"
               update="false"/>
               <!--多对一映射关系-->
               <many-to-one name="friend"
               column="friend_id"
               update="false"/>
                <!--设置关联关系-->
                <set name="friends"
                    inverse="true"
                    order-by="id">
                        <key column="friend_id"/>
                        <!—一对多映射-->
                        <one-to-many class="Cat"/>
                </set>
        </class>
</hibernate-mapping>
2.2 组件应用的方法
组 件有两种类型,即组件(component)和动态组件(dynamic-component)。在配置文件中,component元素为子对象的元素与 父类对应表的字段建立起映射关系。然后组件可以声明它们自己的属性、组件或者集合。component元素的定义如下所示:
<component
        name="propertyName"
        class="className"
        insert="true|false"
        upate="true|false"
        access="field|property|ClassName">
        <property ...../>
        <many-to-one .... />
        ........
</component>
在这段代码中,name是指属性名,class是类的名字,insert指的是被映射的字段是否出现在SQL的INSERT语句中,upate指出被映射的字段是否出现在SQL的UPDATE语句中,access指出访问属性的策略。
2.3  Hiebernate的基本配置
Hibernate 的数据库连接信息是从配置文件中加载的。Hibernate的配置文件有两种形式:一种是XML格式的文件,一种是properties属性文件。 properties形式的配置文件默认文件名是hibernate.properties,一个properties形式的配置文件内容如下所示:
#指定数据库使用的驱动类
hibernate.connection.driver_class = com.mysql.jdbc.Driver r
#指定数据库连接串
hibernate.connection.url = jdbc:mysql://localhost:3306/db
#指定数据库连接的用户名
hibernate.connection.username = user
 #指定数据库连接的密码
hibernate.connection.password = password
 #指定数据库使用的方言
hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect
 #指定是否打印SQL语句
hibernate.show_sql=true
在配置文件中包含了一系列属性的配置,Hibernate将根据这些属性来连接数据库。
在XML格式的配置文件中,除了基本的Hibernate配置信息,还可以指定具体的持久化类的映射文件,这可以避免将持久化类的配置文件硬编码在程序中。XML格式的配置文件的默认文件名为hibernate.cfg.xml,一个XML配置文件的示例如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
         <session-factory>
                   <!--显示执行的SQL语句-->
                   <property name="show_sql">true</property>                                   
                   <!--连接字符串-->
                   <property name="connection.url">jdbc:mysql://localhost:3306/STU</property>                 
                   <!--连接数据库的用户名-->
                   <property name="connection.username">root</property>                 
                   <!--数据库用户密码-->
                   <property name="connection.password">root</property>
                 
                   <!--数据库驱动-->
                   <property name="connection.driver_class">com.mysql.jdbc.Driver</property>                 
                   <!--选择使用的方言-->
                   <property name="dialect">org.hibernate.dialect.MySQLDialect</property>                 
                   <!--映射文件 -->
                   <mapping resource="com/stuman/domain/Admin.hbm.xml"/>                
                   <!--映射文件-->
                   <mapping resource="com/stuman/domain/Student.hbm.xml" />
         </session-factory>
</hibernate-configuration>
properties形式的配置文件和XML格式的配置文件可以同时使用。当同时使用两种类型的配置文件时,XML配置文件中的设置会覆盖properties配置文件的相同的属性。
2.4 对象标识符号
在 关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相 同来判断两对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java 对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。如下代码所示,三次调用了Session的 load()方法,分别加载OID为1或3的User对象。
Transaction tx = session.beginTransaction();
User user1 =  (User)session.load(User.class,new Long(1));
User user2 =  (User)session.load(User.class,new Long(1));
User user3 =  (User)session.load(User.class,new Long(3));
System.out.println( user1 == user2 );
System.out.println( user1 == user3 );
应 用程序在执行上述代码时,第一次加载OID为1的User对象,从数据库中查找ID为1的记录,然后创建相应的User实例,并把它保存在Session 缓存中,最后将该实例的引用赋值给变量user1。第二次加载OID为1的对象时,直接把Session缓存中OID为1的实例的引用赋值给变量 user2。因此,表达式user1==user2的结果为true。
标识的生成可以使用不同的策略,表4.1为Hibernate内置的标识生成策略。
表 4.1  Hibernate标识生成策略
标识符生成器
描述
increment
适用于代理主键。由Hibernate自动以递增方式生成。
identity
适用于代理主键。由底层数据库生成标识符。
sequence
适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。
hilo
适用于代理主键。Hibernate分局high/low算法生成标识符。
seqhilo
适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。
native
适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。
uuid.hex
适用于代理主键。Hibernate采用128位的UUID算法生成标识符。
uuid.string
适用于代理主键。UUID被编码成一个16字符长的字符串。
assigned
适用于自然主键。由Java应用程序负责生成标识符。
foreign
适用于代理主键。使用另外一个相关联的对象的标识符。
2.5  Hibernate映射类型
在对象/关系映射文件中,Hibernate采用映射类型作为Java类型和SQL类型的桥梁。Hibernate映射类型分为2种:内置映射类型和自定义映射类型。
1  内置映射类型
Hibernate对所有的Java原生类型、常用的Java类型如String、Date等都定义了内置的映射类型。表4.2列出了Hibernate映射类型、对应的Java类型以及对应的标准SQL类型。
表4.2  Hibernate内置映射类型
Hibernate映射类型
Java类型
标准SQL类型
大小
integer/int
java.lang.Integer/int
INTEGER
4字节
long
java.lang.Long/long
BIGINT
8字节
short
java.lang.Short/short
SMALLINT
2字节
byte
java.lang.Byte/byte
TINYINT
1字节
float
java.lang.Float/float
FLOAT
4字节
double
java.lang.Double/double
DOUBLE
8字节
big_decimal
java.math.BigDecimal
NUMERIC
 
character
java.lang.Character/java.lang.String/char
CHAR(1)
定长字符
string
java.lang.String
VARCHAR
变长字符
boolean/ yes_no/true_false
java.lang.Boolean/Boolean
BIT
布尔类型
date
java.util.Date/java.sql.Date
DATE
日期
timestamp
java.util.Date/java.util.Timestamp
TIMESTAMP
日期
calendar
java.util.Calendar
TIMESTAMP
日期
calendar_date
java.util.Calendar
DATE
日期
binary
byte[]
BLOB
BLOB
text
java.lang.String
TEXT
CLOB
serializable
实现java.io.Serializablej接口的任意Java类
BLOB
BLOB
clob
java.sql.Clob
CLOB
CLOB
blob
java.sql.Blob
BLOB
BLOB
class
java.lang.Class
VARCHAR
定长字符
locale
java.util.Locale
VARCHAR
定长字符
timezone
java.util.TimeZone
VARCHAR
定长字符
currency
java.util.Currency
VARCHAR
定长字符
2  自定义映射类型
Hibernate 提供了自定义映射类型接口,允许用户以编程的方式创建自定义的映射类型。用户自定义的映射类型需要实现 net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType接口。具体的创建自定义映 射类型的方法请参考hibernate官方文档或相关资料,这里不再详细介绍。

3.1 一对一映射
Hibernate中,持久化对象间的一对一关联是通过one-to-one元素定义的。其定义方式如下所示。
<one-to-one
        name="propertyName"
        class="ClassName"
        cascade="all|none|save-update|delete"
        constrained="true|false"                           
        outer-join="true|false|auto"                       
        property-ref="propertyNameFromAssociatedClass"   
        access="field|property|ClassName"                 
/>
在 这段代码中,name是指属性的名字,class指的是被关联的类的名字。cascade是可选项,表明操作是否从父对象级联到被关联的对象。 constrained表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。
outer -join也是可选项,它指的是当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。property-ref指 定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。access是Hibernate用来访问属性的策略。
一对一关联有两种不同的形式,即主键关联和唯一外键关联:
1  主键关联
主键关联不需要额外的表字段。如下所示的代码,将Student和Person表的主键进行一对一关联:
<one-to-one name="person" class="Person"/>
<one-to-one name="student" class="Student" constrained="true"/>
Person和Student两个表中相关字段是对等的。在下面的代码中,Person表的主键将采用foreign的方式生成。
<class name="Person" table=" Person ">
    <id name="id" column=" Person _ID">
        <generator class="foreign">
            <param name="property">employee</param>
        </generator>
    </id>
    ...
    <one-to-one name="Student"
        class="Student"
        constrained="true"/>
</class>
2  惟一外键关联
此种关联方式是指一个外键与一个惟一的关键字相关联,上面的Student和Person的例子,如果使这种关联方式,应该表达成:
<many-to-one name=" Person " class="Person" column=" Person _ID" unique="true"/>
3.2 多对一映射
持久化对象间的多对一关联是通过many-to-one元素定义的。其定义方式如下所示。
<many-to-one
        name="propertyName"
        column="column_name"
        class="ClassName"
        cascade="all|none|save-update|delete"
        outer-join="true|false|auto"
        update="true|false"
        insert="true|false"
        property-ref="propertyNameFromAssociatedClass"
        access="field|property|ClassName"
/>
在 这段代码中,name指类的属性名,column指表的字段名,class是可选项,指关联的类的名字。cascade指明哪些操作会从父对象级联到关联 的对象,outer-join指的是当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。update用于指定对 应的字段是否用于UPDATE,property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应,access为可选项,指访问属性的策 略。
4.4 Hibernate的检索方式
Hibernate的检索方式主要有HQL、QBC、QBE检索等几种方式。Hibernate查询语言(Hibernate Query Language,简称HQL)是一种面向对象的查询语言。HQL功能强大且简单易学,它具有以下功能。
  • 在查询语句中设定各种查询条件。
  •  支持投影查询,即仅检索出对象的部分属性。
  •  支持分页查询。
  •  支持连接查询。
  •  支持分组查询,允许使用having和group by关键字。
  •  提供内置聚集函数,如sum()、min()、max()等。
  •  能够调用用户自定义的SQL函数。
  •  支持子查询,即嵌入式查询。
  •  支持动态绑定参数。
Session接口的find()方法及Query接口都支持HQL检索方式。如下代码是一个使用Query接口查询的示例。
//创建一个Query对象
Query query = session.createQuery ( “form User as u where u.name=:userName” + “ and u.age=:userAge” ) ;
 //动态绑定参数
query.setString( “userName” , “Bush” );
query.setString( “userAge” , “50” );
 //执行查询语句,返回查询结果X
List results = query.list();
Query By Criteria(QBC)和Query By Example(QBE)提供了检索对象的其他方式,这些检索方式主要由Criteria接口、Criterion接口、Expression类和 Example类组成,支持在运行时动态生成查询语句。关于QBC和QBE的内容可以参考Hibernate官方文档或相关书籍,这里不再详细介绍。
 

分享到:
评论

相关推荐

    hibernate技术研究对比总结

    **HIBERNATE技术总结** Hibernate 是一个流行的 Java 应用程序框架,它提供了一种对象关系映射(ORM)解决方案,将数据库操作转化为面向对象的编程。此文档旨在研究和对比 Hibernate 技术的不同方面,帮助开发者更...

    完整的hibernate技术综合资料

    hibernate学习笔记chm帮助文档包括hibernate技术的从基础入门到深入的详细讲解..

    Struts和Hibernate技术实现电子商务系统(电子书)

    ### Struts和Hibernate技术在电子商务系统中的应用 #### J2EE框架下的电子商务系统构建 《Struts和Hibernate技术实现电子商务系统》一书深入探讨了如何利用Struts和Hibernate两大技术来构建高效、稳定的电子商务...

    Hibernate技术手册

    《Hibernate技术手册》是针对Java开发人员的一份详尽指南,它深入剖析了Hibernate这一流行的持久化框架。Hibernate是一个对象关系映射(ORM)工具,它简化了数据库操作,允许开发者使用面向对象的方式处理数据库交互...

    Hibernate技术

    **Hibernate技术** Hibernate是一种流行的Java持久化框架,它实现了对象关系映射(ORM),解决了Java应用程序在处理对象模型与关系数据库之间不匹配的问题。在Java编程中,由于面向对象特性和关系数据库理论的差异...

    无废话Hibernate技术实用笔记

    【无废话Hibernate技术实用笔记】 Hibernate 是一款强大的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中操作数据库的简便方法。ORM工具的主要目标是减少开发者与数据库之间的交互复杂性,使得程序...

    Hibernate技术手册中文版

    《Hibernate技术手册中文版》是Java开发者的重要参考资料,它详细阐述了Hibernate这一流行持久化框架的使用和原理。Hibernate作为Java领域广泛采用的对象关系映射(ORM)工具,极大地简化了数据库操作,使得开发者...

    hibernate技术实现的例子

    **hibernate技术实现的例子** Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。这个例子将深入解析如何利用Hibernate技术进行数据库操作,包括实体类...

    Hibernate技术.PPT

    【Hibernate技术】是Java开发中广泛使用的对象关系映射(ORM)框架,旨在简化数据库访问操作,提高开发效率。Hibernate的核心在于将Java类与数据库表进行映射,使得开发人员可以使用面向对象的方式处理数据库,而...

    在线投票系统(Hibernate技术).rar

    在本项目中,开发者采用了Hibernate技术,这是一款强大的Java对象关系映射(ORM)框架,能够简化数据库操作,使开发过程更加高效。下面将详细讨论Hibernate在构建在线投票系统中的应用及其关键知识点。 1. **...

    struts+hibernate技术整合开发的网上书店

    在"struts+hibernate技术整合开发的网上书店"项目中,这两个框架的整合能有效提高开发效率,提供灵活的数据管理和用户交互。 首先,Struts框架的核心是ActionServlet,它接收HTTP请求并根据配置的ActionMapping将...

    Hibernate技术概述及入门.pdf

    标题:“Hibernate技术概述及入门.pdf” 描述:“Hibernate技术概述及入门” 从提供的文件信息中,我们可以提炼出关于Hibernate的关键知识点,以下是对这些知识点的详细解释: ### Hibernate技术概述 Hibernate...

    课程指标要求-Hibernate技术.doc

    【课程指标要求-Hibernate技术.doc】是一份针对Hibernate技术的教育标准文档,旨在培养具备移动通信应用软件工程师能力的学员。课程定位在学习的第二阶段,重点在于应用部分,要求学员在开课前已掌握JDBC API编程、...

    电子商务网站 项目Hibernate技术

    【标题】:“电子商务网站项目Hibernate技术” 在电子商务领域,构建高效、稳定的网站是至关重要的,尤其是在处理大量数据交互时。Hibernate作为一种强大的对象关系映射(ORM)框架,为Java开发者提供了便捷的数据...

    Hibernate技术在综合网管上应用的研究.pdf

    【标题】:“Hibernate技术在综合网管上应用的研究” 【描述】:该研究探讨了Hibernate技术如何在综合网络管理系统(INM)中被应用,强调了Hibernate作为一种持久层框架,如何通过对象关系映射(ORM)提高数据访问...

    在线论坛BBS(Hibernate技术)

    **在线论坛BBS(Hibernate技术)** 在信息技术领域,开发一个在线论坛BBS(Bulletin Board System)是一项常见的任务,它允许用户进行互动讨论、分享知识和建立社区。在这个项目中,我们采用了一种强大的对象关系...

    Hibernate技术手册.chm(台湾写的)

    《Hibernate技术手册》是针对Java开发人员的一本详尽指南,由台湾的专家编写,深入浅出地介绍了Hibernate这一强大的对象关系映射(ORM)框架。Hibernate作为一个开源的ORM工具,能够极大地简化Java应用程序对数据库...

    hibernate技术课程讲解.ppt

    hibernate技术课程讲解.ppt 。全面深入讲解技术。

Global site tag (gtag.js) - Google Analytics