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 ( ..... ....