• 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"/>标签即可。
  • 相关阅读:
    Linux磁盘、目录、文件操作命令
    VMware虚拟机网络环境类型
    ASCII
    关于String StringBuffer StringBuilder
    多线程并发编程
    TCP面向连接网络编程
    记一次渗透某XX站
    记一次对微信引流网站的简单渗透测试
    幕布V1.1.9最新版漏洞集合
    java代码审计文章集合
  • 原文地址:https://www.cnblogs.com/sybk/p/10004741.html
Copyright © 2020-2023  润新知