Hibernate3.6 学习笔记

框架的诞生必然是为了解决某一问题,要对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会根据数据库的能力选择 identitysequence 或者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" />
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值