hibernate是jdbc轻量级的封装,本身不具备事务管理的能力,在事物管理层面,一般是委托于底层的jdbc和jta来完成调度的。下面这篇文章主要给大家介绍了Java事务管理学习之Hibernate的相关资料,需要的朋友可以参考下。

环境与版本

hibernate 版本:Hibernate 4.2.2 (下载后的文件名为hibernate-release-4.2.2.Final.zip,解压目录hibernate-release-4.2.2.Final)

数据库: Oracle 10g

导入lib\required 中的所有jar 包

理论说明

1、SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory 并从中获取Session实例

2、Session作为贯穿Hibernate的持久化管理器核心,提供了众多的持久化的方法,如save(), update ,delete ,find(Hibernate 3中已经取消了此方法)等,通过这些方法我们可以透明的完成对象的增删改查(CRUD-- create read update delete),这里所谓的透明是指,Session在读取,创建和删除影射的实体对象的实例时,这一系列的操作将被转换为对数据库表中数据的增加,修改,查询和删除操作。

Session有以下的特点

1)不是线程安全的,应该避免多个线程共享同一个Session实例

2)Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源

3)Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。

3、Hibernate Session缓存被称为Hibernate的第一级缓存。SessionFactory的外置缓存称为Hibernate的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存 存放元数据和预定义SQL, SessionFactory的内置缓存是只读缓存。

4、Hibernate Session缓存的三大作用:

1)减少数据库的访问频率,提高访问性能。

2)保证缓存中的对象与数据库同步,位于缓存中的对象称为持久化对象。

3)当持久化对象之间存在关联时,Session 保证不出现对象图的死锁。

Session 如何判断持久化对象的状态的改变呢?

Session 加载对象后会为对象值类型的属性复制一份快照。当Session 清理缓存时,比较当前对象和它的快照就可以知道那些属性发生了变化。

5、Session 什么时候清理缓存?

1)commit()方法被调用时

2)查询时会清理缓存,保证查询结果能反映对象的最新状态。

3)显示的调用session 的 flush方法。

session 清理缓存的特例:

当对象使用 native 生成器 时 会立刻清理缓存向数据库中插入记录。

实例代码

测试的代码目录如下:

hibernate.cfg.xml

/p>

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

true

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@XX.26.158.43:1521:orcl

org.hibernate.dialect.OracleDialect

Product.java/**

* @Title: Product.java

* @Package com.oscar999.trans.hibernate

* @Description:

* @author XM

* @date Feb 15, 2017 1:44:47 PM

* @version V1.0

*/

package com.oscar999.trans.hibernate;

import java.io.Serializable;

/**

* @author XM

*

*/

public class Product implements Serializable {

public Product() {

}

private Integer id;

private String name;

private String price;

private static final long serialVersionUID = 1L;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPrice() {

return price;

}

public void setPrice(String price) {

this.price = price;

}

}

Product.hbm.xml<?xml version="1.0"?>

not-null="true" unique="true" length="20" />

not-null="false" unique="false" length="20" />

TestMain.Java/**

* @Title: TestMain.java

* @Package com.oscar999.trans.hibernate

* @Description:

* @author XM

* @date Feb 15, 2017 2:02:17 PM

* @version V1.0

*/

package com.oscar999.trans.hibernate;

import java.io.File;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

/**

* @author XM

*

*/

public class TestMain {

/**

* @param args

*/

public Session getSession() {

Session session = null;

Configuration conf = new Configuration().configure(new File("src/com/oscar999/trans/hibernate/hibernate.cfg.xml"));

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();

SessionFactory sf = conf.buildSessionFactory(serviceRegistry);

session = sf.openSession();

return session;

}

public void addProduct(Session session, String name, String price) {

Transaction t = session.beginTransaction(); // 1. comment1

Product product = new Product();

product.setId(1);

product.setName(name);

product.setPrice(price);

try {

session.save(product);

t.commit(); // 2. comment2

} catch (Exception e) {

t.rollback();

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

TestMain testMain = new TestMain();

Session session = testMain.getSession();

testMain.addProduct(session, "product1", "price1");

if (session != null && session.isOpen()) {

session.close();

}

}

}

说明:

1.

id 的产生策略是自己指定, 所以在代码中有 product.setId(1);否则无法添加成功

2. Transaction t = session.beginTransaction();

Hibernate本身没有实现自己的事务管理功能,而是对底层JDBC事务或JTA事务的轻量级封装

3.Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

如果你什么都不配置,默认情况下使用JDBCTransaction

4. 在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。

JDBC和Hibernate 处理事务的关联

Hibernate本身没有实现自己的事务管理功能,而是对底层JDBC事务或JTA事务的轻量级封装

JTA

JTA来管理跨Session的长事务,那么就需要使用JTATransactionjavax.transaction.UserTransaction tx = new InitialContext();.lookup("javax.transaction.UserTransaction");;

Session s1 = sf.openSession();;

...

s1.flush();;

s1.close();;

...

Session s2 = sf.openSession();;

...

s2.flush();;

s2.close();;

tx.commit();;

Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。

总结

java hibernate详细_Java事务管理学习之Hibernate详细介绍相关推荐

  1. 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题

    解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 参考文章: (1)解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 (2)https://www.cn ...

  2. JAVA项目中的事务管理

    **JAVA项目中的事务管理 事务:保证一组对数据库操作动作的完整性(一致性, 安全性),也就是说:这一组动作要么都成功,要么都失败 1.JDBC对事务的支持 Java应用传统上使用JDBC(Java ...

  3. Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解

    声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念.Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spri ...

  4. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopalliance org.asp ...

  5. java jta 例子_Java事务与JTA

    一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...

  6. 事务管理学习笔记:事务特性与常见并发异常

    事务管理笔记 什么是事务? 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全不执行. 事务特性 原子性:事务是应用中不可再分的最下执行体 一致性:事务的执行结果,必须数据从一 ...

  7. java集群_JAVA架构师学习:实践ZooKeeper 应用场景与集群管理,辛勤总结

    ZooKeeper 典型的应用场景 Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生 ...

  8. java sql编辑器_Java工程师完整学习路线

    大部份同学都不太了解 Java 后端或者说今后应聘Java/J2EE开发工程师究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java相关技术等等,导致想学,但又很迷茫,不知从何下手. 以过来人的经历 ...

  9. java存入光盘_java 这是 学习笔记(jdk7)书中的光盘里的源码,不知大家需要不,里面都是新手 的好 Develop 238万源代码下载- www.pudn.com...

    文件名称: java下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1272 KB 上传时间: 2013-04-01 下载次数: 18 提 供 者: 孙鹏启 详细 ...

最新文章

  1. Silverlight中的拖拽实现的图片上传---1
  2. Linux桌面极速文件浏览器PCMan
  3. jdbc mysql数据库增删查改_通过JDBC对Mysql数据库进行简单的增删改查
  4. c++ template(9)trait和Policy
  5. Eclipse中查看Android源代码
  6. 阿里云mysql创建多个用户_阿里云MySQL创建指定用户访问指定表
  7. 微型计算机2014年9月下,2014年9月计算机应用基础》网络教育统考真题.doc
  8. Linux:Vim的安装与配置
  9. python工资一般多少-Python工资多少?就业发展前景怎么样?
  10. win hook codeproject
  11. 敏捷项目管理的五个要素
  12. owasp_OWASP数据工程师
  13. AD8226+AD5293
  14. java将中文转为拼音
  15. 突破性进展什么意思_宣布突破性发展2011
  16. 理解:simulation、emulation、模拟、仿真
  17. java实现DES加解密算法
  18. Polr-kyuan的PHP短网址程序源码
  19. jsoup爬虫工具介绍
  20. Android 新浪微博客户端

热门文章

  1. 师兄送福利:蓝牙调试工具使用教程
  2. 《李宏毅机器学习特训营》免费开放!直播教学!
  3. 第十六届的无线信标-2021-线圈参数测试和仿真
  4. 对声音信标信号的采样频率
  5. 将打包好的VUE文件部署到Web容器(Nginx)中,解决接口调用跨域问题
  6. 刘道成mysql视频教程_燕十八刘道成Mysql 系列视频教程 Mysql视频教程打包下载
  7. mysql 查看建表dll_关于C# Mysql.Data.dll 查询数据库表的一些小问题
  8. cesium 设置时间_Cesium之地形制作与合并
  9. 如何阅读微控制器数据手册:探索硬件 ?
  10. FPGA之道(12)FPGA芯片的配置方式