hibernate知识点分析之配置

本文详细探讨了Hibernate的配置方式,包括hibernate.properties和hibernate.cfg.xml文件的作用。这两种配置文件分别用于设置数据库连接信息和映射信息,涉及连接配置如数据库连接、映射文件添加,以及hibernate-mapping元素的属性解析,如schema、catalog、default-cascade等,同时讲解了class元素、id和property元素的详细配置选项和用途,为深入理解和配置Hibernate提供了全面指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         hibernate中的配置主要有两种:一种是包含了hibernate与数据库的基本连接信息,在hibernate工作的初始阶

段,这些信息先后被加载到Configuration和SessionFactory实例中;另一种包含了hibernate的基本映射信息,即系

统中每一个类与其对应的数据库表之间关联信息,在hibernate工作的初始阶段,这些信息通过hibernate.cfg.xml的

mapping节点被加载到Configuration和SessionFactory实例中。这两种文件信息包含了hibernate所有的运行期参数。

 

一、连接配置 

 1 实现包含了hibernate与数据库的基本连接信息的配置方式有两种方式:

   1.1hibernate.properties作为配置文件

    这种方式比较适合初学者,在hibernate发布包的etc路径下,提供了一个hibernate.properties文件,该文件列出了所

    有的hibernate的属性,每个配置段给了大致的注释,用户只要取消所需配置段的注释,就可以快速配置hibernate和

    数据库连接。

    hibernate.properties文件创建Configuration对象的并添加映射文件的方法:

    方式一  addResource()直接添加映射文件

//实例化configuration对象 

Configuration cfg = new Configuration() 

//多次调用addResource()方法,添加映射文件 

cfg.addResource("Item.hbm.xml") 

cfg.addResource("Bid.hbm.xml"); 

   由于hibernate.properties文件没有提供hibernate映射文件的方式。因此使用hibernate.properties文件作为配置文件

   时, 必须使用Configuration的addResource()方法来添加映射文件。因为映射文件和持久类是一一对应的,可以通

   过Configuration对象来添加持久类,让hibernate自己来搜索映射文件。

   方式二  addClass()添加持久类

//实例化configuration对象  

Configuration cfg = new Configuration() 

//多次调用addClass()方法,直接添加持久化类  

cfg .addClass(ppp.Item.class) 

cfg .addClass(ppp.BId.class); 

 1.2.hibernate.cfg.xml作为配置文件

<!--标准的xml文件的起始行,version='1.0'表明xml的版本,encoding='gb2312'表名xml的编码方式>
<?xml version='1.0' encoding='gb2312'?>
<!--表名解析本xml文件的dtd文档位置,dtd是DocumentType Definition的缩写,即文档类型的定义,
xml解析器使用dtd文档来检查xml文件的合法性-->
<!--hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在  
  
Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC  
  
         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  
         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<!--声明hibernate配置文件的开始-->
<hibernate-configuration>
     <!--声明以下的配置是针对session-factory配置的,SessionFactory是hibernate中的一个类,这个类主要负责保存hibernate的配置信息以及对session的操作-->
     <session-factory>
         <!--配置数据库的驱动程序hibernate在连接数据库时,需要用到数据库的驱动程序-->
         <property name="hibernate.connection,driver.class">com.mysql.jdbc.Driver</property>
         <!--设置数据库连接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服务器名称,此处为本机,hibernate是数据库名-->
         <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate</property>
         <!--连接数据库用户名-->
         <property name="hibernate.connection.username">root</property>
         <!--连接数据库密码-->
         <property name="hibernate.connection.password">admin</property>
         <!--数据库连接池的大小-->
         <property name=hibernate.connection.pool.size>20</property>
         <!--是否在后台显示hibernate用到的sql语句,开发时设置为true,便于查错,程序运行在eclipse时可以在控制台显示sql语句,项目部署后可以设置为fasle,提高运行效率-->
         <property name="hibernate.show_sql">true</property>
         <!--jdbc.fetch_size是指hibernate每次从数据库中取出并放到jdbc的statement中的记录条数。fetchSize设置的越大,读数据库的次数就越少,速度也就越快;fetchSize设置的越小则相反-->
         <property name="jdbc.fetch_size">50</property>
         <!--jdbc.batch_size是指hibernate批量插入,删除和更新时每次操作的记录数,BatchSize越大,批量操作的向数据库发送sql次数越少,速度就越快,同样耗用内存就越大-->
         <property name="jdbc.batch_size">23</property>
         <!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。对分页的结果集。对分页时的设置非常有帮助-->
         <property jdbc.use_scrollable_resultset">false</property>
         <!--connection.useUnicode连接数据库时是否使用Unicode编码-->
         <property name="Connection.useUnicode">true</property>
         <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式,最好设置为gbk,用gb2312有的字符不全-->
         <property name="connection.characterEncoding">gbk</property>
         <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
         <property  name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
         
         <!-是否自动创建数据库表  他主要有一下几个值:  
  
           validate:当sessionFactory创建时,自动验证或者schema定义导入数据库。  
  
           create:每次启动都drop掉原来的schema,创建新的。  
  
           create-drop:当sessionFactory明确关闭时,drop掉schema。  
  
           update(常用):如果没有schema就创建,有就更新。  
  
         --> 
         <property name="hbm2ddl.auto"></property>
         <!配置此处 sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时,  
hibernate将session绑定到当前线程,事务结束后,hibernate  
将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession  
()时,将得到一个新的session,并重新开始这一系列工作。-->
         <property name="current_session_context_class"></property>

         <!--指定映射文件为“user.hbm.xml”-->
         <mappingresourcemappingresource="com/hibernate/usermanage/entity/user.hbm.xml">
     </session-factory>
</hibernate-configuration>

2 包含映射信息的配置文件

<span xmlns="http://www.w3.org/1999/xhtml" style=""><?xml version="1.0"?>  
  
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
  
<hibernate-mapping>  
  
    <class name="com.hibernate.usermanage.User" table="user">  
  
        <id name="id" column="id" type="string">  
  
            <generator class="uuid"></generator>  
  
        </id>  
  
        <property name="name" column="name" type="string"></property>  
  
        <property  name="cardId"     column="cardId"type="string"></property>  
  
        <property name="age" column="age" type="int"></property>  
  
        <set name="address" table="address" cascade="save-update">  
  
            <key column="adr_id"></key>  
  
            <many-to-many class="com.hibernate.usermanage.Address" column="address_id">  
  
            </many-to-many>  
  
        </set>  
  
    </class>  

 信息解析:

      1.1  hibernate-mapping

            这个元素包括一些可选的属性。schema和catalog属性,指明了这个映射所连接(refer)的表所在的schema

            和/或catalog名称。假若指定了这个属性,表名会加上所指定的schema和catalog的名字扩展为全限定名。假

            若没有指定,表名就不会使用全限定名。 default-cascade指定了未明确注明cascade属性的Java属性和集合

            类Hibernate会采取什么样的默认级联风格。auto- import属性默认让我们在查询语言中可以使用非全限定名的

            类名。        

     <span xmlns="http://www.w3.org/1999/xhtml" style=""><hibernate-mapping  
     schema="schemaName" (1)  
     catalog="catalogName" (2)  
     default-cascade="cascade_style" (3)  
     default-access="field|property|ClassName" (4)  
     default-lazy="true|false" (5)  
     auto-import="true|false" (6)  
     package="package.name" (7)  
     /></span> 

   (1) schema (可选): 数据库schema的名称。
   (2) catalog (可选): 数据库catalog的名称。
   (3) default-cascade (可选 - 默认为 none): 默认的级联风格。
   (4) default-access (可选 - 默认为 property): Hibernate用来访问所有属性的策略。可以通过实现PropertyAccessor

        接口自定义。
   (5) default-lazy (可选 - 默认为 true): 指定了未明确注明lazy属性的Java属性和集合类, Hibernate会采取什么样的

        默认加载风格
   (6) auto-import (可选 - 默认为 true): 指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的

        类)。
   (7) package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。

     1.2 class

     使用class元素来定义一个持久化类:


    <span xmlns="http://www.w3.org/1999/xhtml" style=""><class  
    name="ClassName" (1)  
    table="tableName" (2)  
    discriminator-value="discriminator_value" (3)  
    mutable="true|false" (4)  
    schema="owner" (5)  
    catalog="catalog" (6)  
    proxy="ProxyInterface" (7)  
    dynamic-update="true|false" (8)  
    dynamic-insert="true|false" (9)  
    select-before-update="true|false" (10)  
    polymorphism="implicit|explicit" (11)  
    where="arbitrary sql where condition" (12)  
    persister="PersisterClass" (13)  
    batch-size="N" (14)  
    optimistic-lock="none|version|dirty|all" (15)  
    lazy="true|false" (16)  
    entity-name="EntityName" (17)  
    check="arbitrary sql check condition" (18)  
    rowid="rowid" (19)  
    subselect="SQL expression" (20)  
    abstract="true|false" (21)  
    node="element-name"  
    /></span>  

(1) name (可选): 持久化类(或者接口)的Java全限定名。如果这个属性不存在,Hibernate将假定这是一个非

     POJO的实体映射。
(2) table (可选 - 默认是类的非全限定名): 对应的数据库表名。
(3) discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。它可以接

     受的值包括 null 和 not null。
(4) mutable (可选,默认值为true): 表明该类的实例是可变的或者不可变的。
(5) schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。
(6) catalog (可选): 覆盖在根<hibernate-mapping>元素中指定的catalog名字。
(7) proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。
(8) dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变

     过的字段。
(9) dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值

     字段。
(10) select-before-update (可选, 默认为 false): 指定Hibernate除非确定对象真正被修改了(如果该值为true-译注

       ),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transient object)关联到

       一个新的session中时执行的update()中生效),这说明Hibernate会在UPDATE 之前执行一次额外的

       SQL SELECT操作,来决定是否应该执行 UPDATE。
(11) polymorphism(多态) (可选, 默认值为 implicit (隐式) ): 界定是隐式还是显式的使用多态查询(这只在

       Hibernate的具体表继承策略中用到-译注)。
(12) where (可选) 指定一个附加的SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条件。
(13) persister (可选): 指定一个定制的ClassPersister。
(14) batch-size (可选,默认是1) 指定一个用于根据标识符(identifier)抓取实例时使用的"batch size"(批次抓取数

       量)。
(15) optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。
(16) lazy (可选): 通过设置lazy="false",所有的延迟加载(Lazyfetching)功能将被全部禁用(disabled)。
(17) entity-name (可选,默认为类名): Hibernate3允许一个类进行多次映射(前提是映射到不同的表),并且允许使用

       Maps或XML代替Java层次的实体映射(也就是实现动态领域模型,不用写持久化类-译注)。
(18) check (可选): 这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查。
(19) rowid (可选):Hibernate可以使用数据库支持的所谓的ROWIDs,例如: Oracle数据库,如果你设置这个可选的 
       rowid, Hibernate可以使用额外的字段rowid实现快速更新。ROWID是这个功能实现的重点,它代表了一个存储元

       组(tuple)的物理位置。
(20) subselect (可选): 它将一个不可变(immutable)并且只读的实体映射到一个数据库的子查询中。当你想用视图代替

        一张基本表的时候,这是有用的,但最好不要这样做。更多的介绍请看下面内容。
(21) abstract (可选): 用于在<union-subclass>的继承结构(hierarchies)中标识抽象超类。

 

   1.3 id
     被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性,为每一个实例包含唯一的

     标识。<id> 元素定义了该属性到数据库表主键字段的映射。

<id  
    name="propertyName" (1)  
    type="typename" (2)  
    column="column_name" (3)  
    unsaved-value="null|any|none|undefined|id_value" (4)  
    access="field|property|ClassName" (5)  
      
    length="L" (6)  
      
    <generatorclassgeneratorclass="generatorClass"/>  
</id>  

(1) name (可选): 标识属性的名字。
(2) type (可选): 标识Hibernate类型的名字。(如果没配置,hibernate将会自动转化成相应的数据库类型)
(3) column (可选 - 默认为属性名): 主键字段的名字。
(4) unsaved-value (可选 - 默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚

     刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注)但未再次持

     久化的实例区分开来。
(5) access (可选 - 默认为property): Hibernate用来访问属性值的策略。

(6)length="L"指定长度

 

1.4 Generator
 可选的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例

需要某些配置值或者初始化参数,用<param>元素来传递。

<id name="id"type="long" column="cat_id">  
     <generatorclassgeneratorclass="org.hibernate.id.TableHiLoGenerator">  
     <paramnameparamname="table">uid_table</param>  
     <paramnameparamname="column">next_hi_value_column</param>  
     </generator>  
</id>  

所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。

increment
 用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使

 用。

identity
   对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或

   者int类型的。 sequence在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用

   生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo
   使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是

    hibernate_unique_key 和next_hi)作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
seqhilo
   使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid
   用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一

  个32位16进制数字的字符串。
guid
   在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串
native
   根据底层数据库的能力选择identity, sequence 或者hilo中的一个
assigned
   让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。手动分配主键的

   时候要设置成它。
select
   通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
foreign
   使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

1.5 property
 <property>元素为类定义了一个持久化的,JavaBean风格的属性。

<span xmlns="http://www.w3.org/1999/xhtml" style=""><property  
     name="propertyName" (1)  
     column="column_name" (2)  
     type="typename" (3)  
     update="true|false" (4)  
     insert="true|false" (4)  
     formula="arbitrary SQL expression"(5)  
     access="field|property|ClassName"(6)  
     lazy="true|false" (7)  
     unique="true|false" (8)  
     not-null="true|false" (9)  
     optimistic-lock="true|false" (10)  
     generated="never|insert|always" (11)  
     node="element-name|@attribute-name|element/@attribute|."  
      
     index="index_name"  
     unique_key="unique_key_id"  
     length="L"  
     precision="P"  
     scale="S"  
     />  
</span>  

(1) name: 属性的名字,以小写字母开头。
 (2) column (可选 - 默认为属性名字): 对应的数据库字段名。也可以通过嵌套的<column>元素指定。
 (3) type (可选): 一个Hibernate类型的名字。
 (4) update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了

      的字段。这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一

      个(或多个)字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。
 (5) formula (可选): 一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据

      库字段。
 (6) access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。
 (7) lazy (可选 - 默认为 false): 指定指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)(

      需要运行时字节码增强)。
 (8) unique (可选): 使用DDL为该字段添加唯一的约束。同样,允许它作为property-ref引用的目标。
 (9) not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。
 (10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。

        换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
 (11) generated (可选 - 默认为 never): 表明此属性值是否实际上是由数据库生成的。

typename可以是如下几种:
    Hibernate基本类型名(比如:integer, string, character,date, timestamp,float, binary, serializable, object,

                blob)。
 一个Java类的名字,这个类属于一种默认基础类型 (比如: int, float,char, java.lang.String, java.util.Date,

     java.lang.Integer, java.sql.Clob)。
 一个可以序列化的Java类的名字
 一个自定义类型的类的名字。(比如: com.illflow.type.MyCustomType)。

 基本值类型(Hibernate内建立自己的类型,从java转化成数据库类型) string:从java.lang.String 到 VARCHAR

     (或者Oracle的 VARCHAR2)的映射。
     date, time, timestamp:从java.util.Date和其子类到SQL类型DATE, TIME 和TIMESTAMP (或等价类型)的映射。
     calendar, calendar_date:从java.util.Calendar 到SQL 类型TIMESTAMP和 DATE(或等价类型)的映射。
     big_decimal, big_integer:从java.math.BigDecimal和java.math.BigInteger到NUMERIC (或者 Oracle 的

               NUMBER类型)的映射。

     locale, timezone, currency:从java.util.Locale, java.util.TimeZone 和java.util.Currency 到VARCHAR (或者

               Oracle 的VARCHAR2类型)的映射. Locale和 Currency 的实例被映射为它们的ISO代码。TimeZone的实例被

               影射为它的ID。
     Class:从java.lang.Class 到 VARCHAR (或者 Oracle 的VARCHAR2类型)的映射。Class被映射为它的全限定名。
     Binary:把字节数组(byte arrays)映射为对应的 SQL二进制类型。
     Text:把长Java字符串映射为SQL的CLOB或者TEXT类型。
     Serializable:把可序列化的Java类型映射到对应的SQL二进制类型。你也可以为一个并非默认为基本类型的可序

               列化Java类或者接口指定Hibernate类型serializable。
clob, blob:JDBC 类 java.sql.Clob 和 java.sql.Blob的映射。某些程序可能不适合使用这个类型,因为blob和clob对象

               可能在一个事务之外是无法重用的。(而且, 驱动程序对这种类型的支持充满着补丁和前后矛盾。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值