`
schy_hqh
  • 浏览: 552215 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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中注册实体类

   

分享到:
评论

相关推荐

    Hibernate 基础.ppt

    【Hibernate 基础】是Java开发中一个重要的部分,主要关注如何将对象模型与关系数据库进行映射,以简化数据库操作。本PPT由传智播客制作,旨在帮助学习者掌握Hibernate的基础知识和应用。 首先,我们需要理解基于B/...

    hibernate基础jar包

    hibernate基础jar包。包含junit,antlr,don4j,hibernate-commons-annotations,hibernate-core,hibernate-jpa-api,javassit,jboss-logging,jboss-transaction-api

    HIbernate基础包

    在本"Hibernate基础包"中,包含了用于SSH开发所需的全部核心库,使得开发者能够快速搭建项目并进行数据库交互。 首先,Hibernate的核心功能在于它的ORM(对象关系映射)机制。ORM允许开发者通过Java对象来操作...

    Hibernate基础jar包

    本篇文章将深入探讨`Hibernate基础jar包`的构成,以及它们在Java Hibernate框架中的作用。 首先,Hibernate的核心jar包是实现ORM功能的基础。这些jar包包括但不限于以下: 1. **hibernate-core.jar**:这是...

    Hibernate基础教程Hibernate基础教程

    **Hibernate基础教程** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发人员能够以面向对象的方式处理数据。本教程将深入探讨Hibernate的基础知识,包括安装配置、实体类定义、...

    Hibernate基础学习源码

    本资源“Hibernate基础学习源码”提供了五个不同阶段的学习示例,分别命名为Hibernate_01至Hibernate_04以及Hibernate_M2M,涵盖了Hibernate的基本概念、配置、实体映射、CRUD操作以及多对多关系的处理。 1. **...

    hibernate基础 入门/ hibernate basic

    ### Hibernate基础知识点详解 #### 一、什么是对象关系映射(ORM)以及为什么使用ORM? 在企业级应用开发中,持久层(persistence layer)占据了非常重要的地位。它主要负责处理与数据库之间的交互,包括数据的...

    springboot+hibernate基础项目

    在本项目中,"springboot+hibernate基础项目"是一个使用Spring Boot和Hibernate框架构建的典型Java Web应用。Spring Boot简化了Spring的配置过程,而Hibernate则是一个强大的ORM(对象关系映射)工具,使得数据库...

    hibernate 基础jar包和mysql程序驱动

    **Hibernate基础知识** 1. **什么是Hibernate**:Hibernate是一个开源的Java ORM框架,它简化了Java应用与关系数据库之间的交互。通过提供一套API,Hibernate可以将Java对象自动持久化到关系数据库中,反之亦然,...

    Hibernate基础全攻略

    **Hibernate基础全攻略** Hibernate,一个强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的SQL代码。本篇攻略将深入探讨Hibernate的基础知识,帮助初学者...

    hibernate基础教程.pdf

    **Hibernate 框架概述** Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作。ORM 解决了在 Java 应用程序中使用传统 JDBC 进行数据库操作时遇到的繁琐代码问题,将...

    Hibernate基础架包

    这个“Hibernate基础架包”包含了进行Hibernate开发所需的基本库文件,使得开发者可以快速地将其集成到自己的项目中,无需手动配置大量的依赖。 在Hibernate中,核心概念包括: 1. **实体(Entities)**:实体代表...

    hibernate基础教程ppt加api文档

    **Hibernate基础教程** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的数据交互。这个基础教程将引导我们逐步了解Hibernate的核心概念和使用方法。 **一、Hibernate概述*...

    hibernate基础教程 配套代码包 Beginning Hibernate 有PDF教程配套

    《Hibernate基础教程》是针对Java开发人员的一本经典教材,主要涵盖了如何使用Hibernate这一流行的ORM(对象关系映射)框架来简化数据库操作。配套代码包"Bh3 2nd Ed Source Code"则提供了实例代码,帮助读者更好地...

Global site tag (gtag.js) - Google Analytics