try {
.....
connection.setAutoCommit(false);
.....
// 一连串SQL操作
connection.commit();
} catch(Exception)
{
// 发生错误,撤消所有变更
connection.rollback();
}
Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,预设是使用JDBC事务管理,可以在配置文件中加上hibernate.transaction.factory_class属性来指定Transaction的工厂类别,例如:<?xml version="1.0" encoding="utf-8"?>基于JDBC的事务管理是最简单的方式,事实上,Hibernate基于JDBC的事务管理只是对JDBC作了个简单的封装:
</hibernate-configuration>
try {
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
....
tx.commit(); // 必须commit才会更新数据库
} catch(HibernateException e) {
tx.rollback();
}
在一开始的openSession()取得Session时,JDBC的Connection实例之AutoCommit就被设定为false,在
beginTransaction()时,会再度检查Connection实例的AutoCommit为false,在操作过程中,最后要commit
(),否则的话对数据库的操作不会有作用,如果操作过程中因发生例外,则最后commit()不会被执行,之前的操作取消,执行rollback()可撤
消之前的操作,一个实际的程序如下所示:package onlyfun.caterpillar;PS. 要使用MySQL中的事务处理,必须建立事务表类型的表格,例如InnoDB的表格:
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class FirstHibernate {
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
User user = new User();
user.setName("momor");
user.setAge(new Integer(26));
Session session = null;
Transaction tx= null;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
session.save(user);
tx.commit();
}
catch(Exception e) {
e.printStackTrace();
if(tx != null) {
try {
tx.rollback();
}
catch(HibernateException ee) {
ee.printStackTrace();
}
}
}
finally {
if(session != null) {
try {
session.close();
}
catch(HibernateException e) {
e.printStackTrace();
}
}
}
sessionFactory.close();
}
}
CREATE TABLE user (
.....
....