Hibernate基础

 

---------------------》》》》》》》》》》》》》hibernate01_basic

hibernate 基本知识
1.Configuration 调用config()默认加载类路径下的hibernate.cfg.xml配置
2.SessionFactory 管理Session,缓存,事务
3.Session非线程安全的,一个session会话只能由一个线程执行
4.hibernate默认不提交事务,需手动提交
5.通过xxx.hbm.xml配置实体类映射文件
6.通常,开发中都是先设计表,再使用注解将实体类与数据库表之间建立映射关系,很少通过配置文件来进行关联的,都用注解映射。
7.最重要的一点:一个业务逻辑单元放在一个事务中进行操作!!!


---------------------》》》》》》》》》》》》》hibernate02_hibernateUtil
封装一个标准的hibernate工具类
标准的异常抛出


---------------------》》》》》》》》》》》》》hibernate03_ObjectStatus
1.HIbernate对象的状态
    瞬时:与数据库无关,与session无关
        直接通过new产生
    持久:与数据库相关联,与session相关联,被session管理
        使用get(),load()方法加载到内存中的对象
    分离:与数据库关联,与session无关
        从持久状态转换过来的对象
       
2.对象的生命周期/状态转换
    通过session对象的以下方法将对象的状态进行转换
    affects all instances in a Session :
   
    瞬时(Transient)--->持久
        save(),saveOrUpdate() 被session管理,数据库增加/更新一条记录
    持久(Persistence)--->瞬时
        delete()        不被session管理,数据库记录被删除
    离线(Detached)--->持久
        update(),saveOrUpdate()  重新被session管理
    持久--->离线
        evict(),clear(),close()  脱离session管理,数据库记录不发生变化
3.hibernate必须理解的
    优化:
        优化SQL语句的发出时机,尽可能在一次会话中完成插入、更新、删除
        实现机制:在事务提交的时候再进行增,删,改语句的发出
        除非,必须立刻发出,如主键id依赖于数据库,就会立即发出insert语句
    懒加载机制延迟查询语句的发出:
        先从一二级缓存查找,无,才发出查询语句
        除非真正调用到非id属性而且缓存中没有该对象时,才发出查询语句,而且不关联查询
    缓存:
        缓存机制,默认使用以及缓存,通过Session来管理
        可配置二级缓存,通过第三方缓存框架实现
        可配置查询缓存,通过第三方缓存框架实现
    关联关系:
        分析对象之间应该建立何种关联?一对一?多对一?多对多?

       
---------------------》》》》》》》》》》》》》hibernate04_IdGenerator
Hibernate主键生成方式
    native
        主键生成工作交由数据库完成,依赖于数据库的类型,由数据库自动选择identity,sequence,hilo中的一种,hibernate不管
    assigned
        手动维护主键,hibernate不管
    sequence
        oracle数据库主键自增序列
    identity
        MySql或SqlServer数据库的主键自增字段
    hilo
    uuid(universal unique identifier)
        uuid使用一个128-bit的uuid算法生成的字符串类型的标识符,uuid被编码为一个32位的16进制数字的字符串
        UUID包括:IP地址,JVM启动时间,系统时间和一个计数器值(JVM中唯一)
        hibernate会算出一个128位的唯一值插入
        UUID的使用目的:
            让分布式系统中所有的元素,都具有唯一的辨别资讯,不需要额外的辨别工作。
            每个人都可建立于其他人不会冲突的uuid,这样就不用考虑数据库建立时名称冲突的问题。
        UUID经常用来生成主键值完全唯一的情况,是全局的标识符,不会重复!
       
联合主键的配置
    <composite-id name="id" class="StudentId">
            <key-property name="firstname" type="string"></key-property>
            <key-property name="lastname" length="10"></key-property>
        </composite-id>
        联合主键的类需要实现序列化接口!
       
  大对象存储
     Clob:文本大对象,最大4G
     Blob:二进制大对象,最大4G
           
 组合映射
     造成数据库大量冗余,不推荐
     如Address,“北京--海淀--xxx街”,多条记录如果地址相同,就冗余了
     可使用多对一关联来替代组合映射!
    

 
 ---------------------》》》》》》》》》》》》》hibernate05_many2oneTwoWay
 1.多对一双向关联
     要点:
         一的一方使用Set集合,集合使用泛型
         关系的维护在多的一方维护
         命名准确,写配置文件的时候一目了然
         一般使用双向关联(从双方都可以获取到对方的数据)
    many:
    <hibernate-mapping package="org.hqh.hibernate.model">
        <class name="Employee" table="emp">
            <id name="empid">
                <generator class="native"></generator>
            </id>
            <property name="name" type="string"></property>
            <property name="age" type="integer"></property>
            <!--
                定义外键
                name属性描述多方中类的外键属性 class描述被参考的那方
            -->
            <many-to-one name="department" cascade="save-update" lazy="false">
                <!-- 多方表中增加一个外键,给外键取别名【此处的column只是给外键起别名,不定义也可】 -->
                <column name="ref_deptid"></column>
            </many-to-one>
        </class>
    </hibernate-mapping>
   
    one:
    <hibernate-mapping package="org.hqh.hibernate.model">
        <class name="Department" table="dept">
            <id name="deptid">
                <generator class="native"></generator>
            </id>
            <property name="name" type="string"></property>
            <!-- 一方的集合属性 -->
            <!-- inverse=true 强制在多方维护关联,在一方进行操作不会对关联造成任何影响
                 inverse=false 可以在一方维护关系,将发出多余的update语句来更新多方的外键,效率低
                 laze=extra 延迟加载,并且hibernate将查询语句优化了,如判断集合的size时发出count(*)而不是查出所有的元素
            -->
            <set name="employees"  inverse="true" lazy="extra" cascade="save-update">
                <!--
                    key为多方定义的外键名
                    指定多方定义的外键名,将通过此外键去关联对象【一方通过多方中的外键字段反向关联到多方】
                -->
                <key column="ref_deptid"></key>
                <!-- 指定多方的类名 -->
                <one-to-many class="Employee" />
            </set>
        </class>
    </hibernate-mapping>


2.cascade级联属性   
    all:增删改都级联
    save-update:保存employee时发现department未保存,则先保存department,再保存employee
    delete:删除department的时候,先删除其下的所有employee,再删除自己(建议不用,防止数据误删)
    all-delete-orphan:???
    none(默认):不级联
   
3.inverse反向属性
    表示由哪方维护关联关系。
    默认为false,双方都可以维护。
    如果为true,则强制由多方维护关联关系。
    建议使用inverse=true,在多方维护关系
    【如果在一方维护关系,会发出多余的update语句来更新多方的外键字段】
   
   
 ---------------------》》》》》》》》》》》》》hibernate06_one2oneTwoWay
 一对一关联
 1.唯一外键关联(建议使用)
     其中一方加一个字段,作为外键引用对方,增加了额外的外键字段
     增加字段的一方使用many-to-one定义 并使用unique=true
    
 2.主键关联
     双方id主键相同,没有额外的字段
     在哪方使用foreign策略呢?
         注意:通过一方获取另一方,如果是查询使用了foreign的一方,先发一条查询语句查询出自己,如果要得到对方的数据
         会再次发出一条关联查询语句。
         如果查询没有使用foreign的一方,将只发出一条关联查询语句
 
 
 ---------------------》》》》》》》》》》》》》hibernate07_many2manyTwoWay
 多对多关联
     1.如果使用many-to-many,存在以下缺点:
         面对集合进行管理,需要复写hashcode(),equals()方法,否则判断集合中的是否contains某个对象将无法判断
         由于第三张表中只存在2个字段记录关联,无法存储其它信息,如添加时间等,有局限性
     2.拆分多对多为2个多对一关联,将中间表设计为一个实体类,这样做的好处:
         按照多对一进行关联关系的维护,简单,不容易出错,避免了对集合进行操作
         可以在第三表对应的实体类中扩展其它信息,扩展性好
       其中,第三张表作为多的一方,与其它两个实体间构成2个多对一双向关联
    
 
 
---------------------》》》》》》》》》》》》》hibernate08_annotation
使用注解定义实体类之间的映射关系
    注:如果已经定义好数据库表,可以通过工具生成实体类和注解
    hibernate推荐通过实体类来生成数据库表
1.如果集成了spring,则可通过annotation-scan扫描读取
2.未集成sping,则需要在hibernate.cfg.xml中注册实体类

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值