Hibernate事务处理

来源:互联网 发布:爱奇艺视频转换器mac版 编辑:程序博客网 时间:2024/06/08 13:59

悲观锁

1、创建数据库表

这里写图片描述

2、添加数据

1  tom 20

3、建立web项目
建立相应的类:

public class User {  private Integer id;  private String username;  private Integer age;  public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}

建立User.hbm.xml文件

<hibernate-mapping>    <class name="pink.User" table="user">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="native" />        </id>        <property name="username" type="java.lang.String">            <column name="username" />        </property>        <property name="age" type="java.lang.Integer">            <column name="age" />        </property>    </class></hibernate-mapping>

创建hibernate.cfg.xml文件

<hibernate-configuration>    <session-factory>        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver       </property>       <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/test       </property>       <property name="hibernate.connection.username">root       </property>       <property name="hibernate.connection.password">root       </property>       <property name="hibernate.show_sql">true       </property>       <property name="format_sql">true       </property>       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect       </property>       <mapping resource="pink/User.hbm.xml"/>    </session-factory></hibernate-configuration>

建立HibernateUtils.java获取Session实例

public class HibernateUtils {     private static final Configuration config;     private static final SessionFactory factory;     static{        config=new Configuration().configure();        factory=config.buildSessionFactory();     }     public static Session getSession(){        return factory.openSession();     }}

建立测试类UserTest.java

 public void test(){       Session session=HibernateUtils.getSession();        Transaction tx=session.beginTransaction();       User user=(User)session.get(User.class, 1);       System.out.println(user.getId()+" "+user.getUsername()+" "+user.getAge());       tx.commit();       session.close();   }    @Test   public void test2(){       Session session=HibernateUtils.getSession();       Transaction tx=session.beginTransaction();       User user=(User)session.get(User.class, 1);       user.setUsername("link");       session.save(user);       tx.commit();       session.close();   }   @Test   public void test3(){       Session session=HibernateUtils.getSession();       Transaction tx=session.beginTransaction();       User user=(User)session.get(User.class, 1);       user.setAge(30);       session.save(user);       tx.commit();       session.close();   }

4、进行测试
导入Junit包,在test2与test3的user.setXXX(“”)处添加断点
,test2()方法处进行debug As JUint Test,F6单步执行到commit()处,

这里写图片描述

 然后如test2一样执行test3()

这里写图片描述

  对于test2()方法,按Resume执行完成,数据库值改变
1  link 20
  对于test3()同样执行如上,数据库值为
  1  tom 30  

即test2()的执行没有保存添加:

User user=(User)session.get(User.class,1,LoacMode.UPGRADE)

数据库值如test2()执行后的值,而test3()的不到执行

5、乐观锁设置
在数据库表添加version字段,在User类中添加属性及setter与getter方法,设置User.hbm.xml文件,在id后加入:

  <version name="version" column="version" type="integer"/>

测试结果
会执行test2()并改变version值,当执行test3()会抛出异常
只会保存test2()执行结果
6、悲观锁与乐观锁

悲观锁会锁定数据,其他方法无法对该数据修改,而乐观锁是通过version的值判断该数据是否被更改,若更改,其他修改将得不到执行,会抛出异常