java hibernate详细_Java事务管理学习之Hibernate详细介绍
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详细介绍相关推荐
- 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题
解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 参考文章: (1)解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 (2)https://www.cn ...
- JAVA项目中的事务管理
**JAVA项目中的事务管理 事务:保证一组对数据库操作动作的完整性(一致性, 安全性),也就是说:这一组动作要么都成功,要么都失败 1.JDBC对事务的支持 Java应用传统上使用JDBC(Java ...
- Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解
声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念.Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spri ...
- Java事务管理之Spring+Hibernate
环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopalliance org.asp ...
- java jta 例子_Java事务与JTA
一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...
- 事务管理学习笔记:事务特性与常见并发异常
事务管理笔记 什么是事务? 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全不执行. 事务特性 原子性:事务是应用中不可再分的最下执行体 一致性:事务的执行结果,必须数据从一 ...
- java集群_JAVA架构师学习:实践ZooKeeper 应用场景与集群管理,辛勤总结
ZooKeeper 典型的应用场景 Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生 ...
- java sql编辑器_Java工程师完整学习路线
大部份同学都不太了解 Java 后端或者说今后应聘Java/J2EE开发工程师究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java相关技术等等,导致想学,但又很迷茫,不知从何下手. 以过来人的经历 ...
- java存入光盘_java 这是 学习笔记(jdk7)书中的光盘里的源码,不知大家需要不,里面都是新手 的好 Develop 238万源代码下载- www.pudn.com...
文件名称: java下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 1272 KB 上传时间: 2013-04-01 下载次数: 18 提 供 者: 孙鹏启 详细 ...
最新文章
- Silverlight中的拖拽实现的图片上传---1
- Linux桌面极速文件浏览器PCMan
- jdbc mysql数据库增删查改_通过JDBC对Mysql数据库进行简单的增删改查
- c++ template(9)trait和Policy
- Eclipse中查看Android源代码
- 阿里云mysql创建多个用户_阿里云MySQL创建指定用户访问指定表
- 微型计算机2014年9月下,2014年9月计算机应用基础》网络教育统考真题.doc
- Linux:Vim的安装与配置
- python工资一般多少-Python工资多少?就业发展前景怎么样?
- win hook codeproject
- 敏捷项目管理的五个要素
- owasp_OWASP数据工程师
- AD8226+AD5293
- java将中文转为拼音
- 突破性进展什么意思_宣布突破性发展2011
- 理解:simulation、emulation、模拟、仿真
- java实现DES加解密算法
- Polr-kyuan的PHP短网址程序源码
- jsoup爬虫工具介绍
- Android 新浪微博客户端
热门文章
- 师兄送福利:蓝牙调试工具使用教程
- 《李宏毅机器学习特训营》免费开放!直播教学!
- 第十六届的无线信标-2021-线圈参数测试和仿真
- 对声音信标信号的采样频率
- 将打包好的VUE文件部署到Web容器(Nginx)中,解决接口调用跨域问题
- 刘道成mysql视频教程_燕十八刘道成Mysql 系列视频教程 Mysql视频教程打包下载
- mysql 查看建表dll_关于C# Mysql.Data.dll 查询数据库表的一些小问题
- cesium 设置时间_Cesium之地形制作与合并
- 如何阅读微控制器数据手册:探索硬件 ?
- FPGA之道(12)FPGA芯片的配置方式