2019独角兽企业重金招聘Python工程师标准>>>

业务场景:

先展示一份hibernate配置文件,然后来详细说里面蕴含的东西。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="cn.com.besttone.report.domain.ReportCompOrderDetail" table="REPORT_COMP_ORDER_DETAIL"dynamic-update="true" dynamic-insert="true" optimistic-lock="version" schema="BESTTONETICKET"><cache usage="nonstrict-read-write" /><id name="id" unsaved-value="null" type="java.lang.Long" column="ID" length="19"><generator class="sequence" ><param name="sequence">SEQ_REPORT_COMP_ORDER_DETAIL</param></generator></id><property name="statusFlag" type="java.lang.String" column="STATUS_FLAG" /><property name="checkAccountStatus" type="java.lang.String" column="CHECK_ACC_STATUS" /><property name="checkAccountDate" type="java.util.Date" column="CHECK_ACC_DATE" /><property name="spWriteBackStatus" type="java.lang.String" column="SP_WRITE_BACK_STATUS" /><property name="dataSource" type="java.lang.String" column="DATA_SOURCE" /><property name="cpId" type="java.lang.Long" column="CPID" /><property name="cardType" type="java.lang.String" column="CARD_TYPE" /><property name="insuranceProvideCode" type="java.lang.String" column="INSURE_PROVIDER_CODE" /></class>
</hibernate-mapping>

在这里主要分析xml里面配置的属性,我们用的是oracle数据库

schema:oracle的schema定义:A schema is a collection of database objects (used by a user.)。就是一个数据库对象的集合,包括了tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。所以相对而言,我们在hibernate查询数据的时候,可以配置schema,也可以不进行配置,因为schema,默认为用户名。

dynamic-update="true" dynamic-insert="true" :因为在hibernate帮我我们生成实际的sql语句的时候,当属性为null,他也会生成对应的sql,如果我们配置了这两个属性,就可以只生成不为null的属性值,对应的有更新,和插入。

例:update HBTEST set VAL1=?,VAL2=? where ID=?

同样的操作如果把设置为true的话,sql语句只包含更新的字段:update HBTEST set VAL1=? where ID=?

optimistic-lock

悲观锁:通常是由数据库机制实现的,在整个过程中把数据锁住(查询时),只要事务不释放(提交或回滚),任何用户都不能查看和修改。

当有一个方法通过悲观锁机制加载某个对象的时候,对这个对象进行了一系列的操作,在进行操作的时候,也就是只要事务未提交,这个锁就一直存在。当另外一个方法加载这个对象的时候(两个对象是一个对象,即唯一标示符的值是相同的)只会发出查询语句,停止不动,因为,前一个方法使用了悲观锁机制加载的这个对象,并没有结束事务(提交或回滚),因此这时是排他的。当第一个方法提交了事务,第二个方法才可以加载成功并按照自己的意愿执行其所有操作。

悲观锁的使用:悲观锁解决了更新丢失( lost update )问题,但是也带来了并发问题 à 并发不好

乐观锁:

观锁其实不是一种锁,也就不是锁住的问题,而是给数据库表加入了一个字段(可以使版本号( version ),也可以使一个时间戳( timestamp )),或是进行全部字段 / 脏数据字段比较(这种方式适合于以前遗留下来的系统,在不更改原来表结构的时候使用这种策略)来确定数据是否被修改过,一般的应用是采用数据版本的方式( version )实现,在读取数据的时候将 version 读取出来,在保存数据的时候判断 version 的值是否小于数据库中的 version 的值,小于则不允许更新,否则可以更新。

使用 version 实现乐观锁(推荐使用):在一个事务提交后就会更改数据库,数据库中 version 的值会自动加 1 。实现步骤 à 1 、在持久化类中加入 version 属性,生成其 getter 和 setter 方法。 2 、在配置文件中的 <class> 标签中配置一个属性 optimistic-lock=”version” (这个属性的默认值就是 version ,可以不进行配置,但建议配置上) 3 、对 version 字段进行映射,使用 version 标签(这个字段的映射必须在 id 标签的后面第一位) à <version  name=”version”/>

细节分析 à 在一个事务加载某个持久化类时,对这个对象进行了一系列操作,但是还没有提交事务,于此同时,另外一个事物也加载了这个持久化类,并完成了一系列的操作后提交了事务,然后,第一个事务这时也要提交事务了,这样就会抛出一个异常 à org.hibernate.StableObjectStateException:Rows was updated or deleted by another transaction… ,原因是这样的:当一个事务提交时会发出这样一条 SQL 语句 à update 表名 set 所有表属性 =? where id( 唯一标示符值 )=? andversion=? 这个语句中 version=? 是最关键的。以上说的那个例子中,第一个事务拿的是自己的旧的 version 值,进行更更新,而第二个事务在提交后,已经改变了 version ,变成了新的 version 值了,这样第一个事务提交事务时发出的 update 表名 set 所有表属性 =? where id( 唯一标示符值 ) =? and version=? 这条语句将会失败!就会抛出以上异常信息。

乐观锁:适合于高并发。

转载于:https://my.oschina.net/u/731676/blog/268403

从一个hibernate配置文件中了解到的东西相关推荐

  1. hibernate配置文件中inverse的作用

    inverse常用于一对多双向关联关系中. 以Student(学生)和Class(班级)为例,它们之间的关系为一对多的关系,即一个学生只能属于一个班级,一个班级可以包含多个学 生. 学生类定义代码: ...

  2. 连接oracle配置文件参数,Hibernate3 +Oracle10g 集群,hibernate配置文件中如何编写连接参数...

    遇见问题: 使用hibernate3来连接Oracle10g的集群,连接时不稳定,有时候正常连接,有时候不能正常连接.不知道是不是配置文件有问题,请大家帮我查看一下,谢谢各位了! 开发工具:Eclip ...

  3. 对“纯手工编写的第一个Hibernate程序”的改进

    在上一篇博文<纯手工编写第一个Hibernate程序>中,介绍了如何手工编写第一个简单的Hibernate程序.在那个例子中,为了降低程序编写的难度,所有的类都没有包的声明.然而在实际开发 ...

  4. 在Eclipse中写第一个hibernate小例子

    在hibernate自带的文档中,包含了一个很简单的小例子,不过这个小例子是基于ant的,而且说的不是很详细,不利于新手学习.在这里,我将在Eclipse中实现这个例子,并给出详细的实现步骤.     ...

  5. Struts2配置文件中传递参数的一个小问题

    http://blog.csdn.net/CMTobby/article/details/1891120 最近在Struts2中配置action时,经常要在配置文件中给一个页面或者action传递若干 ...

  6. 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置

    如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置: url=jdbc:mysql://127.0.0.1:3306/airipo?useUnicod ...

  7. 【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记

    问题 详细信息: 若要使他人能够在远程计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的"web.config"配置文件中创建一个 标记.然后应将此 标 ...

  8. 【每天一个Python小知识】用yaml的yaml.safe_load()方法读取配置文件中的参数

    文章目录 ymal安装 配置文件格式 配置文件读取 yaml是专门用来写配置文件的,因其简洁高效而被大众喜爱. ymal安装 python3安装: pip install pyyaml#python2 ...

  9. 第一个hibernate程序HelloWorldHibernate

    HelloWorldHibernate步骤: HelloWorld 1,新建java项目hibernate_0100_HelloWorld 2,学习User-library-hibernate,并加入 ...

最新文章

  1. 实战项目 10: 货物清单应用
  2. node软件环境安装
  3. directly test Gateway frontend service in AG3 SICF
  4. 一步步使SSH连接您的github仓库
  5. 计算机网络概述(一)
  6. mysql批量取消多行sql_mysql批量删除指定前缀的表,批量修改表名的SQL语句
  7. nginx proxy_pass后的url加不加/的区别
  8. Android 上百实例源码分析以及开源分析
  9. socket -- epoll模型
  10. 大数据之flume数据采集
  11. JDY-10M蓝牙简易组网教程
  12. java excel 数组公式_Excel数组公式怎么使用? Excel数组公式计算的实例教程
  13. TestStand系统框架简介
  14. Android Studio系统盘瘦身
  15. 【编程实践】什么是计算机编程?定义软件开发。What is Computer Programming? Defining Software Development.
  16. Spring中的事务控制(Transacion Management with Spring)
  17. Mycat 1.6日志分类-Sequoia数据库相关日志
  18. exchange 2010 脱机地址簿操作
  19. hive、impala的客户端,cli、beeline、WebHCat
  20. HM1548B升压转换器芯片的数据手册免费下载

热门文章

  1. Golang——error处理及panic、recover使用的正确姿势
  2. java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
  3. kettle连接mysql教程_kettle 连接 mysql8
  4. c++ linux 环境,C++ 环境设置
  5. android nv21图片格式,Android -- 将NV21图像保存成JPEG
  6. Nagios 配置及监控
  7. 机器学习笔记(十二)——马尔科夫模型
  8. 为什么很多企业都喜欢鹅厂出来的产品经理?
  9. 互联网日报 | 5月12日 星期三 | 全国人口共14.1178亿人;长安汽车迈入2000万辆时代;Soul递交纳斯达克招股书...
  10. 希望这些建议对你有帮助