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简介

Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)。

一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。

一个资源管理器(resource manager)是任意类型的持久化数据存储。

事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。

7.2、JTA与JDBC

JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans(EJB)、一个用J2EE Connector Architecture 规范编译的资源分配器。

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在其数据访问引擎中内置了乐观锁的实现

可以将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开

时间: 2024-07-29 13:56:05

Hibernate(四)结构-基础语义和事务的相关文章

Hibernate快速入门基础部分(一)

简介 学习Java有一段时间了,一直在忙碌着学习,每天大量的新知识和新技术来不及消化,第二天又接着学习.有想法有时会想一下,大部分作为学习者角色完成这段时间的学习.反正最终不忘记自己的初心和学习的意义.好啦~不闲扯了,今天小Hi入门,主要学习持久化对象概述.映射对象标识符.和如何操纵持久化对象 Hibernate简介 1.Hibernate是处于开发中的持久层框架,他是一个ORM映射工具(Object/RelationMapping,对象-关系映射,就是通过将Java对象映射到数据库表,通过操作

Hibernate关系映射基础

1.  Hibernate关系映射基础 1.1.  Doctype <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 指定根元素和dtd文件的命名空间. 1.2.  hibernate-mapping <hiberna

Spring 框架基础(05):事务管理机制,和实现方式

本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚. Connection conn = DriverManager.getConnection(); try { // 自动提交设置为false conn.setAutoCommit(false); // 执行增删改查操作 // 当操作成功后

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

史上最详细的Android Studio系列教程四--Gradle基础

史上最详细的Android Studio系列教程四--Gradle基础

【OC语法快览】四、基础内存管理

Basic Memory Management                                                           基础内存管理 If you're writing an application for Mac OS X, you have the option to enable garbage collection. In general, this means that you don't have to think about memory

学习Spring必学的Java基础知识(7)----事务基础知识

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. SQL Server 2

Spring整合hibernate(1)之基础整合

Spring整合hibernate3之基础整合 Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础: 1.导入hibernate的包和Spring的包 1.1.导入Spring的依赖包 1.2.导入Log4j的依赖包:log4j-1.2.16.jar 1.3.导入dbcp的依赖包:commons-dbcp-1.4.jar.commons-pool-1.5.6.jar 1.4.导入hibernate3的依赖包 hibernate全部版本地址:http: