zoukankan      html  css  js  c++  java
  • Hibernate基础知识详解

    一、Hibernate框架
            Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC进行了非常轻量级的对象封装,它将POJO类与数据库表建立映射关系,是一个
        全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行。Hibernate可以应用在任何使用 DBC的场合,既可以在Java的客户端程序使用,
        也可以在Servlet/JSP的Web应用中使用。Hibernate下载orm,jar包官网:https://hibernate.org/orm/releases/
    二、ORM(对象关系映射)模型框架
            用于实现面向对象编程语言里不同类型系统的数据之间的转换。对象关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的
        开发方法是当今主流开发方法,关系数据库是应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务
        实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多
        关联和继承关系。因此,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
    三、Hibernate配置文件
        1.映射文件
            映射配置文件主要是用于描述实体类与数据表之间的映射关系。位置要与实体类在同一个包下。名称:类名.hbm.xml

          <hibernate-mapping>
                <class name="*.*.*" table="t_customer" catalog="***">
                    <id name="id" column="c_id">
                        <generator class="identity" />
                    </id>
                    
                    <property name="name" column="c_name" length="20" />
                    
                    <set name="orders" inverse="false" cascade="save-update">
                        <key column="c_customer_id" />
                    </set>
                </class>
            </hibernate-mapping>

            (1)统一声明包名,这样在<class>中就不需要写类的全名。
            (2)关于<class>标签配置
                name 属性:类的全名称
                table 表的名称,可以省略,这时表的名称就与类名一致
                catalog 属性:数据库名称 可以省略.如果省略,参考核心配置文件中 url 路径中的库名称
            (3)关于<id>标签,<id>是用于建立类中的属性与表中的主键映射。
                name 类中的属性名称
                column 表中的主键名称 column 它也可以省略,这时列名就与类中属性名称一致
                length 字段长度
                type 属性 指定类型
                <generator>它主要是描述主键生成策略。
            (4)关于<property>标签 ,是描述类中属性与表中非主键的映射关系。
        2.核心配置文件
            主要包含了连接数据库相关信息,hibernate相关配置等。位置:在项目根目录下创建一个。名称:hibernate.cfg.xml
            根据hibernate.properties文件下的信息可以配置

    <hibernate-configuration>
                <session-factory>
                    <!-- 配置关于数据库连接的四个项 driverClass url username password -->
                    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
                    <property name="hibernate.connection.url">jdbc:mysql:///**</property>
                    <property name="hibernate.connection.username">***</property>
                    <property name="hibernate.connection.password">***</property>
    
                    <!-- 设置连接提供者 -->
                    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
                    <!-- c3p0连接池的配置 -->
                    <property name="hibernate.c3p0.max_size">20</property> <!-- 最大连接池 -->
                    <property name="hibernate.c3p0.min_size">5</property> <!-- 最小连接数 -->
                    <property name="hibernate.c3p0.timeout">120</property> <!-- 超时 -->
                    <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空闲连接 -->
    
                    <!-- 可以将向数据库发送的sql显示出来 -->
                    <property name="hibernate.show_sql">true</property>
                    <!-- 格式化sql -->
                    <property name="hibernate.format_sql">true</property>
    
                    <!-- hibernate的方言 -->
                    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
                    <!-- 自动创建表 -->
                    <property name="hibernate.hbm2ddl.auto">create</property>
    
                    <!-- 用于设置事务提交方式 -->
                    <property name="hibernate.connection.autocommit">false</property>
    
                    <!-- 配置hibernate的映射文件所在位置 -->
                    <mapping resource=".././*.hbm.xml" />
                    
                </session-factory>
            </hibernate-configuration>    

        注意:无论是映射文件还是核心配置文件,都要有约束在xml文件中,已3.0.dtd为例:

     <!DOCTYPE hibernate-configuration PUBLIC
               "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

            位置是:hibernate的jar包下的projectetchibernate.properties
    四、Hibernate工作原理:
        1.通过 Configuration().configure();        读取并解析 hibernate.cfg.xml 配置文件。
        2.由hibernate.cfg.xml中的<mappingresource="xx/xx/xxx.hbm.xml"/>        读取解析映射信息。
        3.通过 config.buildSessionFactory();        得到 sessionFactory。
        4.sessionFactory.openSession();        得到 session。
        5.session.beginTransaction();        开启事务。
        6.session.getTransaction().commit();        提交事务
        7.关闭 session;
    五、Hibernate持久化类与 主键生成策略
        在 hbm.xml 中可以设置的主键生成策略如下:
        主键生成器                                                描述
        increment                                                  代理主键。由 hibernate 维护一个变量,每次生成主键时自动以递增。 问题:如果有多个应用访问一个数据库,由于每个应用维护自己                           的主键。此时主键可能冲突。建议不采用。
        identity                                                      代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。 比如:mysql 的自增主键,oracle 不支持主键自动生成。                          如果数据库支持自增建议采用。
        sequence                                                  代理主键。Hibernate 根据底层数据库序列生成标识符。条件是数据库支持序 列。比如 oracle 的序列。如果数据库支持序列建议采用。
        native                                                        代理主键。根据底层数据库对自动来选择 identity、sequence、hilo由于生成主键策略的控制权由 hibernate 控制,所以不建议采用。
        uuid                                                        代理主键。Hibernate 采用 128 位的 UUID 算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生                           成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。
        assigned                                                   自然主键。由 java 程序负责生成标识符。不建议采用。
    六、Hibernate持久化对象状态
        1. 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用
        完成后,会被jvm直接回收掉,它只是用于信息携带。
        简单说:无OID与数据库中的信息无关联,不在 session 管理范围内。
        2. 持久态:在 hibernate session 管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate
        是可以检测到的。
        简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。
        3. 托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不
        存在。对于托管态对象,它发生改变时hibernet不能检测到。
    七、Hibernate注解开发
        1.PO类注解开发
            @Entity 声明一个实体
            @Table 来描述类与表对应
            @Id 来声明一个主键
            @GenerateValue 用它来声明一个主键生成策略
            默认情况下相当于native,可以选择的主键生成策略 AUTO IDENTITY SEQUENCE
            @Column 来定义列
          注意:对于 PO 类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列。列的名称就是属性的名称
            @Temporal 来声明日期类型
              TemporalType.DATA 只有年月日
              TemporalType.TIME 只有小时分钟秒
              TemporalType.TIMESTAMP 有年月日小时分钟秒
        2.一对多(多对一)      
            @OneToMany
            @ManyToOne
        3.级联
            @Cascade
    八、Hibernate检索方式概述
        Hibernate提供以下5种检索对象方式:
            1 导航对象图检索方式,根据已加载的对象导航到其它对象
            2.OID检索方式,按照对象的OID来检索对象
            3.HQL检索方式,使用面向对象的HQL查询语言
            4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装基于字符串形式的查询语句,提供了更加面向对象的查询接口
            5.本地SQL检索方式,使用本地数据库的SQL查询语句
    九、Hibernate事务管理
        1.Hibernate事务管理级别
            xxx.hbm.xml配置事务管理

    <property name="hibernate.connection.isolation">4</property>

            1 代表的事务隔离级别为 READ UNCOMMITTED
            2 代表的事务隔离级别为 READ COMMITTED
            4 代表的事务隔离级别为 REPEATABLE READ
            8 代表的事务隔离级别为 SERIALIZABLE
            EAD_UNCOMMITED 读取未提交,它引发所有的隔离问题
            READ_COMMITTED 读已提交,阻止脏读,可能发生不可重复读与虚读.
            REPEATABLE_READ 重复读 阻止脏读,不可重复读 可能发生虚读
            SERIALIZABLE 串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。 (效率低下)
            ORACLE 默认的是事务隔离级别 READ_COMMITTED
            MYSQL 默认的事务隔离级别 REPEATABLE_READ
        2. Hibernate中session管理
            Hibernate提供了三种管理session的方式:
              (1)Session 对象的生命周期与本地线程绑定(ThreadLocal)
              (2)Session 对象的生命周期与 JTA 事务绑定(分布式事务管理)
              (3)Hibernate 委托程序来管理 Session 的生命周期

  • 相关阅读:
    WCF 第八章 安全 确定替代身份(中)使用AzMan认证
    WCF 第八章 安全 总结
    WCF 第八章 安全 因特网上的安全服务(下) 其他认证模式
    WCF Membership Provider
    WCF 第八章 安全 确定替代身份(下)模仿用户
    WCF 第八章 安全 因特网上的安全服务(上)
    WCF 第九章 诊断
    HTTPS的七个误解(转载)
    WCF 第八章 安全 日志和审计
    基于比较的排序算法集
  • 原文地址:https://www.cnblogs.com/xu-cceed3w/p/8955172.html
Copyright © 2011-2022 走看看