transaction:事务。在执行某个session方法时,必须将其放在一个事务之中。hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式来处理。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
JDBC是默认自动提交事务,若想hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式。就可在hibernate中不使用事务(此方法不推荐)
注:实现doWork()方法,重写里面的execute()方法。调用session.save()后,还要调用session.flush()来强制输出sql语句。
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
//测试类
public class StudentsTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){ //初始化
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象,打开会话
session=sessionFactory.openSession();
//打开事务
// transaction=session.beginTransaction();
}
@After
public void destory(){ //释放资源
//提交事务
// transaction.commit();
//关闭会话
session.close();
//关闭会话工厂
sessionFactory.close();
}
@Test
public void testSaveStudents(){
//生成学生对象
Students s=new Students(3,"张三丰","男",new Date(),"武当山");
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException { //重写方法
// TODO Auto-generated method stub
connection.setAutoCommit(true); //设置自动提交
}
});
//保存对象进入数据库
session.save(s);
session.flush(); //强制输出sql语句
}
}
这样不用在hibernate中使用事务,可将数据存储在数据库中。