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>
数据更新丢失
如果不考虑隔离性,也会产生写入数据的问题,这一类的问题叫丢失更新的问题。
例如:两个事务同时对某一条记录做修改,就会引发丢失更新的问题。
A事务和B事务同时获取到一条数据,同时再做修改
如果A事务修改完成后,提交了事务
B事务修改完成后,不管是提交还是回滚,如果不做处理,都会对数据产生影响
使用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
hibernate5.0映射配置文件核心配置文件数据更新丢失相关推荐
- mybatis使用map插入数据和Mybatis的核心配置文件LOG4J
mybatis使用map插入数据 UserMapper.java包中写入 int addUser2(Map<Object,String> map); Usermapper.xml < ...
- Springboot-读取核心配置文件及自定义配置文件
读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 核心 ...
- 【SSM框架系列】Mybatis映射配置文件与核心配置文件深入
传统开发方式Dao层实现 编写UserDao接口 public interface UserDao {List<User> findAll() throws IOException;} 编 ...
- 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询
目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...
- SSM_Mybatis_Day01(快速入门、映射文件概述、核心配置文件概述、相应API、代理开发方式、映射文件深入、数据类型的映射、列名和属性名不一致的时候的处理)
SSM_Mybatis_Day01(快速入门.映射文件概述.核心配置文件概述.相应API.代理开发方式.映射文件深入.数据类型的映射.列名和属性名不一致的时候的处理) 1. Mybatis mybat ...
- java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)
1.mapper代理 1.mybatis开发dao的方法----引入(为啥要使用mapper代理) 1.SqlSession使用范围 1.SqlSessionFactoryBuilder 通过SqlS ...
- 【SpringBoot零基础案例09】【IEDA 2021.1】SpringBoot将核心配置文件中的自定义配置映射到一个对象
使用@Value注解获取核心配置文件中的值时只能是一个一个的获取,如果在配置文件中有多个对象需要用到名称一样的配置,如name.age等属性,则需要区分是这个属性是哪个对象的.因此可以将这些配置映射到 ...
- 配置MyBatis映射文件以及核心配置文件模板
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.db.properties模板 二.映射文件mapper.xml模板 三.---------MyBatis核心文件 ...
- Mybatis—代理开发和核心配置文件深入
代理开发方式介绍 采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流. Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由 ...
- SpringMVC深度探险 —— SpringMVC核心配置文件详解
在上一篇文章中,我们从DispatcherServlet谈起,最终为读者详细分析了SpringMVC的初始化主线的全部过程.整个初始化主线的研究,其实始终围绕着DispatcherServlet.We ...
最新文章
- TeamViewer 14 on Nvidia Jetson TX2
- python中if not是什么意思,python if not不同应用有什么区别,pythonifnot区别,python 中 "if...
- excel字体颜色对照表 取值0-63
- codeforces 455D Serega and Fun
- json字符串-单、双引号
- oracle更新最新一条记录,update同时更新多条记录
- python计算无穷级数求和常用公式_[python][计算方法]利用无穷级数计算幂运算(开根号)...
- Uni-app 小程序 App 的广告变现之路:全屏视频广告
- 电脑三种方式连接打印机
- 985计算机硕士考公,985大学生不愿意考公务员?并不是瞧不起,真实原因有点扎心...
- 移动应用中的AR开发,6款最受欢迎工具推荐
- 计算机快捷键大全、新手必备
- YOLOV3--训练数据+视频检测
- dd命令 skip 和 seek参数理解
- How To Insult Your Enemies
- 阿里巴巴DevOps实践手册 附下载链接
- java 获取当前时间的三种方法是什么
- 打算自学编程,但是不知道该先学哪门语言入门?
- SQL截取字符串substring
- 6-2应用层-域名系统DNS