zoukankan      html  css  js  c++  java
  • hibernate5.0&映射配置文件&核心配置文件&数据更新丢失

    映射文件基本配置

    约束需要对应版本查询
         <?xml version="1.0" encoding="UTF-8"?>
           <!DOCTYPE hibernate-mapping PUBLIC
           "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

         <hibernate-mapping>
              <!--配置类和表结构的映射-->
            <class name="javabean路径" table="数据库表名称">
                <!--配置id(数据库中的主键映射javabean中的属性)-->
                <id name="javabean属性id" column="数据表主键">
                    <!--主键的生成策略 class: native由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
         其中一种作为主键生成方式。-->
                    <generator class="native"></generator>
                </id>
                
                <!--配置其他的属性-->
                <property name="javabean属性" column="数据表字段" />
            </class>

        </hibernate-mapping>

    配置标签详解

     - 映射文件,即Stu.hbm.xml的配置文件
    <class>标签        -- 用来将类与数据库表建立映射关系
        name     -- 类的全路径
        table    -- 表名.(类名与表名一致,那么table属性也可以省略)
        catalog  -- 数据库的名称,基本上都会省略不写
            
    <id>标签-- 用来将类中的属性与表中的主键建立映射,id标签就是用来配置主键的。
        name     -- 类中属性名
        column      -- 表中的字段名.(如果类中的属性名与表中的字段名一致,那么column可以省略.)

        length     -- 字段的程度,如果数据库已经创建好了,那么length可以不写。如果没有创建好,生成表结构时,length最好指定。

    主键生成策略

    <generator>标签 --使用框架管理主键(自己在操作对象时不需要set设置javabean的主键了),主键生成策略
        class  --使用什么策略

     - native 数据表主键自动增长,数据数据库调用identity或者sequence)(一般使用int和long的包装类做主键)
     - increment 获取数据表主键最大值,进行+1,作为主键
     - identity 数据表主键自动增长(只有mysql可以,oracle数据库没有自动增长)
     - sequence 数据表自动增长(回调函数实现oracle可以,mysql不行)
     - uuid 主键为字符串时使用
     - assigned 主键是自己维护的,不使用Hibernate框架维护(需要自己每次操作对象时存储)

        
    <property>    -- 用来将类中的普通属性与表中的字段建立映射.
        name        -- 类中属性名
        column        -- 表中的字段名.(如果类中的属性名与表中的字段名一致,那么column可以省略.)
        length        -- 数据长度
        type        -- 数据类型(一般都不需要编写,如果写需要按着规则来编写)
     - Hibernate的数据类型    type="string"
     - Java的数据类型        type="java.lang.String"
     - 数据库字段的数据类型    <column name="name" sql-type="varchar"/>

    映射注解配置方式

    [`查看此链接`][1]

    核心配置配置文件

    约束需要对应版本查询
        <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

        <hibernate-configuration>
            <!--必须配置一个session-factory标签,一个数据库对应一个session-factory标签-->
            <session-factory>
                <!--property标签中的配置可以去hibernate(下载解压后的文件)文件下面的project/ect/hibernate.properties找-->

                <!--必须要配置的五个参数,4大参数 mysql驱动配置,数据库的方言-->
                <property name="hibernate.connection.driver_class">com.mysql.jdbhc.Driver</property>
                <property name="hibernate.connection.url">jdbc.mysql://hibernate_day01</property>
                <property name="hibernate.connection.username">账号密码</property>
                <property name="hibernate.connection.password">密码</property>
                <!--数据库的方言(其他数据库的语句生成为指定数据的语句)-->
                <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
                
                <!--可选的配置-->
                <property name="hibernate.show_sql">true</property>
                <property name="hibernate.format_sql">true</property>
                <property name="hibernate.hbm2ddl.auto">create</property>
                <property name="hibernate.hbm2ddl.auto">update</property>

                <!--映射配置文件 需要引入映射的配置文件 指向映射的配置文件地址-->
                <mapping resource="映射配置文件的地址.hbm.xhtml"/>
            </session-factory>
        </hibernate-configuration>

    可选配置详情

    在控制台显示sql语句
    <property name="hibernate.show_sql">true</property>

    显示的sql语句,格式化(不会全部在一行)
    <property name="hibernate.format_sql">true</property>

    同过hibernate设置隔离级别
    一般不需要设置,使用默认就ok(除非有需求),[可以查看事务概述][2]
    <property name="hibernate.connection.isolation">4</property>
    可选值
     - 1—Read uncommitted isolation  -未提交读:以上的读的问题都有可能发生.
     - 2—Read committed isolation      -已提交读:避免脏读,但是不可重复读,虚读都有可能发生.
     - 4—Repeatable read isolation       -可重复读:避免脏读,不可重复读.但是虚读是有可能发生.
     - 8—Serializable isolation               -串行化:以上读的情况都可以避免.

    对数据表结构进行操作
     <property name="hibernate.hbm2ddl.auto">validate</property>
    可选值
     - create 生成数据表结构,如果有表删除再创建
     - create-drop 生成数据表结构,执行完sql语句,删除表
     - update 如果没有表结构,创建表结构.如果有存在,不会创建,添加数据,如果字段不存在生成字段(一般使用)
     - validate 校验映射文件中的javabean属性对应的数据库字段名称
     - property 标签中的配置可以去hibernate(下载解压后的文件)文件下面的`project/ect/hibernate.properties`找
    将session放入线程中,从线程中取出session(用于在业务层开启,提交,回滚事务,dao层从线程中获取session)

    开启事务
    <property name="hibernate.current_session_context_class">thread</property>
    ![可选配置][3]

    数据更新丢失

    如果不考虑隔离性,也会产生写入数据的问题,这一类的问题叫丢失更新的问题。
      例如:两个事务同时对某一条记录做修改,就会引发丢失更新的问题。
        A事务和B事务同时获取到一条数据,同时再做修改
        如果A事务修改完成后,提交了事务
        B事务修改完成后,不管是提交还是回滚,如果不做处理,都会对数据产生影响
    ![丢失更新][4]
    使用Hibernate框架解决丢失更新的问题
    悲观锁
        使用session.get(Customer.class, 1,LockMode.UPGRADE); 方法
            
    乐观锁
        1.在对应的JavaBean中添加一个属性,名称可以是任意的。例如:private Integer version; 提供get和set方法
        2.在映射的配置文件中,提供<version name="version"/>标签即可。
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/sybk/p/10004741.html
Copyright © 2011-2022 走看看