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"/>标签即可。
原文地址:https://www.cnblogs.com/sybk/p/10004741.html