`
jianchen
  • 浏览: 344864 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hibernate学习之第十六篇

阅读更多

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-api Hibernate文档

    这篇文档旨在提供对Hibernate API的深入理解,帮助开发者更高效地使用Hibernate进行数据库操作。 一、Hibernate概述 Hibernate是Java开发中广泛使用的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的...

    Hibernate 用法实例

    本篇内容将通过丰富的实例来深入探讨Hibernate的核心概念和技术,帮助读者从入门到精通,掌握其所有主要用法。** ### 一、Hibernate 概述 Hibernate 提供了一种在Java应用程序中管理关系数据库模型的机制。它通过...

    来自Java Persistence With Hibernate的示例

    本篇将深入探讨“Java Persistence with Hibernate”的核心概念,并通过具体的示例来帮助理解其工作原理和使用方法。 一、Hibernate简介 Hibernate是一个开源的Java库,它提供了在Java应用程序中与关系数据库进行...

    hibernate中文帮助文档

    这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...

    Hibernate API帮助文档

    这篇文档将深入探讨Hibernate API的各个方面,帮助开发者更好地理解和使用它。 一、Hibernate体系结构 Hibernate主要由以下组件构成: 1. Configuration:负责读取配置文件,建立SessionFactory。 2. ...

    Hibernate入门(上)笔记.pdf.zip

    这篇笔记主要涵盖了Hibernate框架的基础知识,它是Java开发中用于对象关系映射(ORM)的热门工具。Hibernate允许开发者用Java对象来操作数据库,消除了传统的JDBC代码,提高了开发效率和代码的可维护性。 一、...

    Hibernate 中文API 入门和开发的好帮手

    这篇文档是Hibernate的中文API,为学习和使用Hibernate提供了一个直观且易于理解的参考。 一、Hibernate概述 Hibernate是Java领域中广泛使用的ORM框架,它将数据库的操作转换为对Java对象的操作,通过配置文件和...

    精通hibernate源码

    Hibernate的缓存管理是其性能优化的关键,可能会讲解第一级缓存(Session缓存),第二级缓存(SessionFactory缓存),以及查询缓存的工作原理和配置。 6. **Chapter 10:事务与并发控制** 事务管理是数据库操作的...

    java web技术开发大全(最全最新)

    涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》各篇独立,适合读者全面学习或对部分内容重点学习。 读者对象 有Java基础,想进一步...

    java web开发技术大全

    涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》各篇独立,适合读者全面学习或对部分内容重点学习。 读者对象 有Java基础,想...

    Java Web开发实例大全

    第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与安全策略 第21章 设计模式与架构 第7篇 综合应用篇 第22...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与安全策略 第21章 设计模式与架构 第7篇 综合应用篇 第22...

    零基础学Java Web 开发(源代码 3到8章)

    提高篇包括第13~16章,主要讲解目#iJavaweb开发中常用的各种框架和新兴技术,如Struts、Spring、Hibernate和Ajax等,这些技术在实际的项目开发中都会被大量用到;第17章是实战篇,主要以HibernateJpetstore为基础,...

    零基础学JAVAWEB

    提高篇包括第13~16章,主要讲解目#iJavaweb开发中常用的各种框架和新兴技术,如Struts、Spring、Hibernate和Ajax等,这些技术在实际的项目开发中都会被大量用到;第17章是实战篇,主要以HibernateJpetstore为基础,...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用...

    hiberante ref document

    本篇将基于提供的"hibernate ref document"进行深入解析,旨在帮助开发者更好地理解和应用Hibernate。 一、Hibernate概述 Hibernate是一种开放源代码的Java库,它允许开发人员在Java应用程序中使用面向对象的方式来...

    一些j2ee学习资料

    16. **J2EE学习SSH+EJB3+Oracle+UML+OA+DRP 实战教程** - 地址:http://www.ibeifeng.com/read.php?tid=1333&u=1007 - 侧重于实际项目的实现过程,适合有一定基础的学习者。 17. **J2EE for 企业应用** - 地址:...

    快意编程 EXT JS Web开发技术详解.pdf

    第16章 Ext3+REST+Spring2+ Hibernate3整合方案 326 第17章 工时统计管理系统 392 本站提供的快意编程 EXT JS Web开发技术详解 PDF版[249.85M]资源来源互联网,版权归该下载资源的合法拥有者所有。

    MyEclipse开发手册之Java篇

    ### MyEclipse开发手册之Java篇 #### 一、概览与目标读者 《MyEclipse开发手册之Java篇》是一本专为Java EE开发者设计的实用指南,它旨在帮助开发者掌握MyEclipse这一强大的集成开发环境(IDE),并利用其进行高效...

Global site tag (gtag.js) - Google Analytics