hibernate 乐观锁 的实现

实体类添加额外的属性version,映射文件中采用属性version 类似于版本控制系统(svn/cvs)的机制

并发冲突时会抛出StableObjectStateException
 
实体类
 

public class Book {
 private int bid;
 private String name;
 private String owner;
 
 private int version;
} //省略无参构造函数和getter/setter

 
 
测试线程类(测试多线程并发访问情况下悲观锁的效果)
 

public class Student extends Thread {
 private int bookid;
 private String stdname;
 public boolean flag = false;
 public Student(String name,int bookid){
  this.bookid = bookid;
  this.stdname = name;
 }
 public void run(){
  
  if(this.borrowBook()){
   System.out.println(this.stdname + "借书 成功!!!");
  }else{
   System.out.println(this.stdname + "借书 失败!!!");
  }
 }
 public boolean borrowBook(){
  Session ss = null;
  Transaction ts = null;
  Book book = null;
  try{
   ss = DBFactory.sf.openSession();
   ts = ss.beginTransaction();
   book = (Book) ss.get(Book.class,bookid);
   book.setOwner(this.stdname);
   ss.save(book);
   ts.commit();
   return true;
  }catch(Exception e){
   ts.rollback();
   e.printStackTrace();
   System.out.println("Exception_false");
   return false;
  }finally{
   ss.close();
  }
 }
}

  
映射文件
 

<hibernate-mapping package="optimistic.entity">
 <class name="Book" table="opti_book">
  <id column="bookid" name="bid">
   <generator class="native"/>
  </id>
  <version name="version" column="version"></version>  <!--此处添加-->
  <property column="bookname" name="name" type="string"/>
  <property column="owner" name="owner" type="string"/>
 </class>
</hibernate-mapping>

  
测试类
 

public class Test {
 
 public static void main(String[] args) {
//  addBook();
  Student lixun = new Student("Lixun",1);
  lixun.start();
  Student zhougege = new Student("zhougege",1);
  zhougege.start();
 }
 
 public static void addBook(){
  Book book = new Book();
  book.setName("**Mei");
  Session ss = null;
  Transaction ts = null;
  try{
   ss = DBFactory.sf.openSession();
   ts = ss.beginTransaction();
   ss.save(book);
   ts.commit();
   ss.close();
  }catch(Exception e){
   ts.rollback();
   e.printStackTrace();
  }
 }
 
}

 产生的异常:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [optimistic.entity.Book#1]
 at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1714)
 at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2357)
 at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)
 at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)
 at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值