- 浏览: 344864 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zy_mensheng:
请问一下 怎么 js没有解析啊 还是钟表图..
调用BIEE提供的web service -
安铁辉:
师兄你很久没更新博客了
Information Dashboard Design读书笔记 -
mojunbin:
很清晰的文章
秒杀相关知识以及技术 -
yanchangjun8102:
楼主你好,我也最近在研究biee的webservice这块,按 ...
调用BIEE提供的web service -
sacredon:
不错,楼主我是看着你的这篇文章写代码调用的BIEE的Web ...
调用BIEE提供的web service
session context和事务边界
用current_session_context_class属性来定义context(用sessionFactory.getCurrentSession()来获得session),其值为:
1,thread:ThreadLocal来管理Session实现多个操作共享一个Session,避免反复获取Session,并控制事务边界,此时session不能调用close。当commit或rollback的时候session会自动关闭。
Open session in view: 在生成(渲染)页面时保持session打开。
2,jta:有JTA事务管理器来管理事务
connection.release_mode:after_statement
悲观锁和乐观锁
悲观锁有数据库来实现:乐观锁hibernate用version和timestamp来实现。
悲观锁定,是在读取记录时将其锁定,对记录更新修改后,解锁释放,其他人才可以进行相关操作。这回导致一些问题,一个人读取了数据后会加锁,但是却并没有继续的操作,导致其他人也想读取相同的记录时就会受限,只能等前一个人操作完后才能进行。
而乐观锁,采取的是版本号和时间戳的方式。比如,两个人都可以读取数据记录,在相应的完成修改提交更新时,先提交的没有问题(当时数据的版本号并没有修改过,提交后会导致版本号增加),后提交的会遇到版本号问题。因为先提交的会导致版本号更新,新的版本号和后提交方的版本号不一致了,会导致后者的回滚,这会提示后者,数据已被更新,要么放弃更改,要么再次读取,然后更新。
示例代码:
User 类源代码如下:与以前的代码的区别是增加了一个版本属性
Public class User{
private int id;
private Name userName;
private Date birthday;
private int version;
}
映射文件的配置也要做相应的修改:
<hibernate-mapping package="hibernatetest">
<class name="User" table="user">
<id name="id">
<generator class="native"/>
</id>
<version name="version"/> //该元素必须位于id标签后
<component name="userName">
<property column="first_name" name="firstName"/>
<property column="last_name" name="lastName"/>
</component>
<property name="birthday"/>
</class>
</hibernate-mapping>
测试代码:
public class Main { public static void main(String[] args) { User user = new User(); user.setBirthday(new Date()); saveUser(user); updateUser(user.getId()); } public static void saveUser(User user) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Name name = new Name(); name.setFirstName("firstName"); name.setLastName("lastName"); user.setUserName(name); session.save(user); tx.commit(); session.close(); } public static void updateUser(int id) { Session s1 = HibernateUtil.getSession(); Transaction tx1 = s1.beginTransaction(); User user = (User)s1.get(User.class, id); user.getUserName().setFirstName("new1 first name");//修该数据 Session s2 = HibernateUtil.getSession(); Transaction tx2 = s2.beginTransaction(); User user2 = (User)s2.get(User.class, id); user2.getUserName().setFirstName("new2 first name");//修该数据 tx1.commit(); tx2.commit(); s1.close(); s2.close(); } }
打印输出的sql语句为:
Hibernate: insert into user (version, first_name, last_name, birthday) values (?, ?, ?, ?)
Hibernate: select user0_.id as id0_0_, user0_.version as version0_0_, user0_.first_name as first3_0_0_, user0_.last_name as last4_0_0_, user0_.birthday as birthday0_0_ from user user0_ where user0_.id=?
Hibernate: select user0_.id as id0_0_, user0_.version as version0_0_, user0_.first_name as first3_0_0_, user0_.last_name as last4_0_0_, user0_.birthday as birthday0_0_ from user user0_ where user0_.id=?
Hibernate: update user set version=?, first_name=?, last_name=?, birthday=? where id=? and version=?
Hibernate: update user set version=?, first_name=?, last_name=?, birthday=? where id=? and version=?
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [hibernatetest.User#1]
Exception in thread "main" org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [hibernatetest.User#1]
在updateUser方法中,提交了两个事务,产生了不一致性。后提交的事务被抛异常回滚。
数据库中表的结构为:
+----+---------+-----------------+-----------+---------------------+
| id | version | first_name | last_name | birthday |
+----+---------+-----------------+-----------+---------------------+
| 1 | 1 | new1 first name | lastName | 2009-02-08 14:32:43 |
+----+---------+-----------------+-----------+---------------------+
第一次保存数据时,版本号为0.更新后版本号升级为1.
Hibernate: update user set version=?, first_name=?, last_name=?, birthday=? where id=? and version=?
这条更新语句说明了hibernate内部是参照了id和version的。version不一致则会出现问题。
除了使用version标签,还可以使用timestamp标签。时间戳标签的类型只能是时间了,通过比较时间的先后来决定这次事务是否执行。但是在比较极端的情况下,可能在并发很高时,时间的差异很小到难以区分时,时间戳会失去作用。所以最稳妥的还是用版本来控制。version标签的type属性可以指定版本属性类型,除了为整型,还可以指定为时间戳,这样就和使用timestamp标签类似了。
发表评论
-
hibernate学习之十八篇
2009-03-16 17:27 810hibernate不适合的场景: 1,不适合OLAP(on- ... -
hibernate学习之十七篇
2009-03-16 12:31 993零碎知识小结: ◆数据类型: 1,<propert ... -
PO and POJO
2009-03-11 23:49 823原文:http://danni505.blog.51cto.c ... -
hibernate学习之第十五篇
2009-03-11 21:33 1034事务与事务边界 hibernat ... -
Hibernate二级缓存攻略(转)
2009-03-09 22:56 845Hibernate二级缓存攻略(转) 很多人对二级缓存都不太 ... -
hibernate学习之第十四篇
2009-03-09 17:48 1173hibernate的内部缓存 hibernate的缓存分为 ... -
hibernate学习之第十三篇
2009-03-09 17:41 1011load方法的懒加载及原理分析 懒加载的目的,减少不必要的数 ... -
hibernate学习之第十二篇(续)
2009-03-06 19:10 988《四》每个具体类映射 ... -
hibernate学习之第十二篇
2009-03-06 15:57 947《三》混合使用“一个 ... -
hibernate学习之第十一篇(2)
2009-03-05 23:00 896《二》每个子类映射到一张表(joined-subclass) ... -
hibernate学习之第十一篇(1)
2009-03-05 22:55 1478hibernate的继承映射 《一》一张表映射一棵继承树 ... -
hibernate学习之第十篇
2009-03-05 13:53 1124级联和关系维护 Cascade 用来说明当对主对象进行某种操 ... -
hibernate学习之第九篇
2009-03-04 22:52 1343hibernate中的集合类型 引入: Hibernate ... -
hibernate学习之第八篇
2009-03-03 22:11 996组件映射 关联的属性是个复杂类型的持久化类,但不是实体即: ... -
hibernat学习之第七篇
2009-03-03 13:06 958多对多关联关系的映射 在操作和性能方面都不太理想,所以多对 ... -
hibernate 学习之第六篇
2009-03-02 20:31 924基于主键的一对一关联 Person类和IdCard,一对一 ... -
深入浅出hibernate摘录2
2009-03-02 00:38 1513以下内容摘自深入浅出hibernate 在编写代码的时候,尽 ... -
深入浅出hibernate摘录
2009-03-01 19:45 1236以下摘自深入浅出hiberna ... -
hibernate学习之第五篇
2009-03-01 19:43 10761, oracle数据库中,user是关键字,如果用户的表名为 ... -
hibernate学习之第四篇(对象状态)
2009-03-01 19:38 1080session 的几个主要方法 ...
相关推荐
这篇文档旨在提供对Hibernate API的深入理解,帮助开发者更高效地使用Hibernate进行数据库操作。 一、Hibernate概述 Hibernate是Java开发中广泛使用的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的...
本篇内容将通过丰富的实例来深入探讨Hibernate的核心概念和技术,帮助读者从入门到精通,掌握其所有主要用法。** ### 一、Hibernate 概述 Hibernate 提供了一种在Java应用程序中管理关系数据库模型的机制。它通过...
本篇将深入探讨“Java Persistence with Hibernate”的核心概念,并通过具体的示例来帮助理解其工作原理和使用方法。 一、Hibernate简介 Hibernate是一个开源的Java库,它提供了在Java应用程序中与关系数据库进行...
这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...
这篇文档将深入探讨Hibernate API的各个方面,帮助开发者更好地理解和使用它。 一、Hibernate体系结构 Hibernate主要由以下组件构成: 1. Configuration:负责读取配置文件,建立SessionFactory。 2. ...
这篇笔记主要涵盖了Hibernate框架的基础知识,它是Java开发中用于对象关系映射(ORM)的热门工具。Hibernate允许开发者用Java对象来操作数据库,消除了传统的JDBC代码,提高了开发效率和代码的可维护性。 一、...
这篇文档是Hibernate的中文API,为学习和使用Hibernate提供了一个直观且易于理解的参考。 一、Hibernate概述 Hibernate是Java领域中广泛使用的ORM框架,它将数据库的操作转换为对Java对象的操作,通过配置文件和...
Hibernate的缓存管理是其性能优化的关键,可能会讲解第一级缓存(Session缓存),第二级缓存(SessionFactory缓存),以及查询缓存的工作原理和配置。 6. **Chapter 10:事务与并发控制** 事务管理是数据库操作的...
涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》各篇独立,适合读者全面学习或对部分内容重点学习。 读者对象 有Java基础,想进一步...
涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》各篇独立,适合读者全面学习或对部分内容重点学习。 读者对象 有Java基础,想...
第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与安全策略 第21章 设计模式与架构 第7篇 综合应用篇 第22...
第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与安全策略 第21章 设计模式与架构 第7篇 综合应用篇 第22...
提高篇包括第13~16章,主要讲解目#iJavaweb开发中常用的各种框架和新兴技术,如Struts、Spring、Hibernate和Ajax等,这些技术在实际的项目开发中都会被大量用到;第17章是实战篇,主要以HibernateJpetstore为基础,...
提高篇包括第13~16章,主要讲解目#iJavaweb开发中常用的各种框架和新兴技术,如Struts、Spring、Hibernate和Ajax等,这些技术在实际的项目开发中都会被大量用到;第17章是实战篇,主要以HibernateJpetstore为基础,...
第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用...
本篇将基于提供的"hibernate ref document"进行深入解析,旨在帮助开发者更好地理解和应用Hibernate。 一、Hibernate概述 Hibernate是一种开放源代码的Java库,它允许开发人员在Java应用程序中使用面向对象的方式来...
16. **J2EE学习SSH+EJB3+Oracle+UML+OA+DRP 实战教程** - 地址:http://www.ibeifeng.com/read.php?tid=1333&u=1007 - 侧重于实际项目的实现过程,适合有一定基础的学习者。 17. **J2EE for 企业应用** - 地址:...
第16章 Ext3+REST+Spring2+ Hibernate3整合方案 326 第17章 工时统计管理系统 392 本站提供的快意编程 EXT JS Web开发技术详解 PDF版[249.85M]资源来源互联网,版权归该下载资源的合法拥有者所有。
### MyEclipse开发手册之Java篇 #### 一、概览与目标读者 《MyEclipse开发手册之Java篇》是一本专为Java EE开发者设计的实用指南,它旨在帮助开发者掌握MyEclipse这一强大的集成开发环境(IDE),并利用其进行高效...