在Hibernate中,主要由Hibernate提供的版本控制功能来实现乐观锁定。Hibernate为乐观锁提供了两种实现,分别基于version的实现和基于timestamp的实现。version元素利用一个递增的整数来跟踪数据表中记录的版本;而timestamp元素则用时间来跟踪数据库表中记录的版本。
accounts表结构
创建实体类
package com.dwx.models;
public class Accounts {
private int id;
private String username;
private double money;
private int version;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}
配置映射
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.dwx.models.Accounts" table="accounts">
<id name="id">
<generator class="native"></generator>
</id>
<version name="version"></version>
<property name="username"></property>
<property name="money"></property>
</class>
</hibernate-mapping>
创建测试类
package com.dwx.models;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Test {
public static void main(String[] args) {
Session session=null;
Transaction tx=null;
try{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
Accounts a=(Accounts)session.load(Accounts.class, 1);
a.setMoney(800);
session.update(a);
tx.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();
}
}
}