}
@AfterClass
public static void afterClass() {
sf.close();
}
?
@Test
public void testSchemaExport() {
new SchemaExport(new Configuration().configure()).create(false, true);
}
?
@Test
public void testSave() {
Session session = sf.openSession();
session.beginTransaction();
?
Account a = new Account();
a.setBalance(100);
session.save(a);
?
session.getTransaction().commit();
session.close();
}
?
@Test
public void testOperation1() {
Session session = sf.openSession();
session.beginTransaction();
?
Account a = (Account)session.load(Account.class, 1);
int balance = a.getBalance();
//do some caculations,此时如果别的事务在这个过程中对balance进行操作,将会导致banlance取值被此session覆盖
balance = balance - 10;
a.setBalance(balance);
session.getTransaction().commit();
session.close();
}
?
@Test
public void testPessimisticlock() {
Session session = sf.openSession();
session.beginTransaction();
?
Account a = (Account)session.load(Account.class, 1,LockMode.UPGRADE);
int balance = a.getBalance();
//do some caculations
balance = balance - 10;
a.setBalance(balance);
session.getTransaction().commit();
session.close();
}
public static void main(String[] args) {
beforeClass();
}
}
(4)测试testPessimisticlock()方法,观察产生的SQL语句如下:
Hibernate:
select
account0_.id as id1_0_0_,
account0_.balance as balance2_0_0_
from
Account account0_
where
account0_.id=? for update
?
Hibernate:
update
Account
set
balance=?
where
id=?
?
?
?
乐观锁:
实验:
(1)修改Account.java
package com.zgy.hibernate.model;
?
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Version;
?
@Entity
public class Account {
private int id;
private int balance;
private int version;
@Version
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
?
?
}
?
?
(2)测试:
package com.zgy.hibernate.model;
?
?
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
?
?
public class HibernateLockTest {
private static SessionFactory sf;
?
@BeforeClass
public static void beforeClass() {
sf = HibernateUtil.getSessionFactory();
}
@AfterClass
public static void afterClass() {
sf.close();
}
?
@Test
public void testSchemaExport() {
new SchemaExport(new Configuration().configure()).create(false, true);
}
?
@Test
public void testSave() {
Session session = sf.openSession();
session.beginTransaction();
?
Account a = new Account();
a.setBalance(100);
session.save(a);
?
session.getTransaction().commit();
session.close();
}
?
@Test
public void testOptimisticLock() {
Session session = sf.openSession();
?
Session session2 = sf.openSession();
?
?
?
?
session.beginTransaction();
Account a1 = (Account) session.load(Account.class, 1);
?
?
session2.beginTransaction();
Account a2 = (Account) session2.load(Account.class, 1);
?
a1.setBala