Hibernate事务处理

###悲观锁###
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的值
判断该数据是否被更改,若更改,其他修改将得不到执行,会抛出异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值