Hibernate(四)结构-基础语义和事务
一、基础语义
核心:
- Configuration
- SessionFactory
- Session
二、Configuration
Configuration类负责管理Hibernate的配置信息,Hiber运行时需要获取一些底层实现基本信息
1.数据库URL
2.数据库用户
3.数据库用户密码
4.数据库JDBC驱动
5.数据库dialect,用于对特定的数据库提供支持,其中包含了针对特定数据库特性的实现
当调用Hibernate时,Hibernate会自动在当前CLASSPATH,中搜寻配置文件,hibernate.cfg.xml,将其读到内存中,作为后继操作的基础配置
Configuration config=new Configuration().configure();
Configuration类一般只有在获取SessionFactory时需要涉及,当获取SessionFactory之后,由于配置信息已经由Hibernate维护并绑定在返回的SessionFactory之上,因此一般情况下无需要再对其进行操作。
也可以不用默认的文件名,使用自定义的文件名,但一定要是.xml格式的
File file=new File("c:/myhibernate.xml");
Configuration config=new configuration().configure(file);
三、SessionFactory
SessionFactory负面创建Session实例
SessionFactory factory=new Configuration().configure().buildSessionFactory();
四、Session
Session session=new Configuration().configure().buildSessionFactory().openSession();
之后就可以调用Session所提供的save,find,flush等方法完成持久层操作
在事务提交的时候,hibernate自动执行flush方法
当Session关闭时,也会自动执行flush方法
如果不在事务中,去数据进行增、删、改、查,需要使用flush(),强制执行数据库同步
五、事务管理
Hibernate是JDBC的轻量级封装,本身并不具务事务管理能力
Hibernate将事务管理委托给底层的JDBC或者JTA
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration> <session-factory>
<!--方言 -->
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<!--数据库URL -->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<!--数据库访问的用户名 -->
<property name="connection.username">accp</property>
<!--数据库访问的用户名的密码 -->
<property name="connection.password">accp</property>
<!--数据库驱动这里是oracle数据库的 -->
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="myeclipse.connection.profile">oracle</property>
<!--是否显示执行的SQL语句 -->
<property name="show_sql">true</property>
<!--是否使用数据库外连接 -->
<property name="hibernate.use_outer_join">true</property>
<!--事务管理类型 -->
<property name="hibernate.transaction.factory_class">
<!-- JDBC事务-->
net.sf.hibernate.transaction.JDBCTransactionFactory
<!-- JTA事务管理-->
<!-- net.sf.hibernate.transaction.JTATransactionFactory -->
</property>
<!--映射文件配置 -->
<mapping resource="com/pb/entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>
六、基于JDBC的事务管理
// 得到Session
Session session=new Configuration().configure().buildSessionFactory().openSession();
// 打开事务
Transaction tran=session.beginTransaction();
// 提交事务
tran.commit();
与下面这段Hibernate只是将JDBC进行封装
//得到数据库连接
Connection dbconn=getConnection();
//将自动提交设置为false
dbconn.setAutoCommit(false);
//提交
dbconn.commit();
在openSession()中,hibernate会初始化数据库连接,与此同时将AutoCommit设置为关闭也就如上面的设置为false。
在session.beginTransaction()方法中Hibernate会再次确认Connection的AutoCommit属性被设定为关闭状态。
它是为了防止用户代码对Session的Connection.AutoCommit属性进行修改.
也就是说从SessionFactory()中获得的Session,其自动提交属性就已经被关闭.
七、JTA事务管理
7.1、JTA简介
7.2、JTA与JDBC
7.3、JTA特点
JTA提供了跨Session的事务管理能力
JTA事务管理则由JAT容器实现,JTA容器对当前加入事务的众多Connection进行调试
JTA的事务周期可横跨多个JDBC Connection生命周期
JTA事务是由JTA Container维护,而参悟事务的Connection无需要事务管理进行干涉.
八、事务中的锁机制
业务逻辑的实现过程中,往往需要保证数据访问的排他性
给我们选定的目标数据上锁,使用无法被其他程序修改
Hibernate 支持两种锁机制:"悲观锁"(Pessimistic Locking)和"乐观锁"(Optimistic Locking).
8.1、悲观锁
指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此在整个数据处理过程中,将数据处于锁定状态
悲观锁的实现往往依靠数据库提供的锁机制,也只有数据库提供的锁机制才能真正保证数据访问的排他性,否则即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据。
Oracle中的悲观锁
select * from login where username='aaaa' for update;
8.2、乐观锁
相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制
乐观锁,大多是基于数据版本 (Version)记录机制实现。
读取数据时,将此版本号一同读出,之后更新时,对版本号加一,此时提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
- 乐观锁机制避免了长事务中的数据库的加锁开销
- 乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性
- Hibernate在其数据访问引擎中内置了乐观锁的实现
可以将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开
Hibernate(四)结构-基础语义和事务的更多相关文章
- Spring 框架介绍 [Spring 优点][Spring 应用领域][体系结构][目录结构][基础 jar 包]
您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 目录 ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...
- Kafka设计解析(八)Exactly Once语义与事务机制原理
转载自 技术世界,原文链接 Kafka设计解析(八)- Exactly Once语义与事务机制原理 本文介绍了Kafka实现事务性的几个阶段——正好一次语义与原子操作.之后详细分析了Kafka事务机制 ...
- Spring 框架基础(05):事务管理机制,和实现方式
本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- php四种基础排序算法的运行时间比较
/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...
- 【Xamarin开发 Android 系列 7】 Android 结构基础(下)
原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...
- 【Xamarin开发 Android 系列 6】 Android 结构基础(上)
原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...
随机推荐
- Codeforces Round #298 (Div. 2) C. Polycarpus' Dice 数学
C. Polycarpus' Dice Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/534/p ...
- 彻底解决每次打开visio都提示windows正在配置visio的问题
出现这个提示windows正在配置XXX软件的问题,是由于在安装一个新的版本时,之前那个版本的office没有完全卸载,注册表内有残留. 最简单的方式,并不是 把HKEY_CURRENT_USER\S ...
- [Dynamic Language] Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录
Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录 源码安装时报错 File "/home/abeenser ...
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
1.时间同步(手动): date -s "2015-07-15 22:13:30" hwclock --systohc (表示系统时间同步到硬件时钟) hwclo ...
- ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小解决办法
1.今天写的存储过程在执行过程中,报如下错误. exec PRO_T_008pro_update_add_delete(17,1,1,1,1,45.0,54.0,45.0,45.0,45.0,54.0 ...
- warning,C4996,sprintf,deprecated,C4996,strcpy,C4996,strcat
在vs2003, vs2005中用sprintf 会出现warning C4996: 'sprintf' was declared deprecated或warning C4996: 'strcpy' ...
- MVC扩展控制器工厂,通过继承DefaultControllerFactory来决定使用哪个接口实现,使用Ninject
希望实现的效果是:对购物车中所有商品的总价,实现9折或8折: 当点击"9折": 当点击"8折": □ 思路 8折或9折是打折接口的不同实现,关键是:由什么条件决 ...
- MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传
本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 ...
- 【linux】linux重启tomcat + 实时查看tomcat启动日志
linux重启tomcat命令: http://www.cnblogs.com/plus301/p/6237468.html linux查看toncat实时的启动日志: https://www.cnb ...
- MyBatis的动态SQL详解-各种标签使用
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...