转载请注明:http://blog.csdn.net/uniquewonderq
上次在说session的时候,要执行session方法的时候要把它方法事务当中,也就是说Hibernate对数据进行的操作都是封装在书屋当中,并且默认是非自动提交方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,这个对象并不会真正的保存在数据库中。
我们知道jdbc是自动提交事务的。如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法, 获得jdbc的connection后,设置其为自动提交事务模式。(注意:通常并不推荐这么做)
下面通过一个例子来演示,使用事务的重要性。
代码语言:javascript复制@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 destroy(){
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
@Test
public void testSaveStudents(){//保存学生用例对象
//生成学生对象
Students s1=new Students(2,"有缘人","女",new Date(),"地球");
session.save(s1);//保存对象进入数据库,无须写sql语句
}
如果注释掉开启事务的语句
代码语言:javascript复制transaction=session.beginTransaction();
以及提交事务的语句,
代码语言:javascript复制transaction.commit();//提交事务
那么,
执行完后,你会发现,数据库里面并没有新的记录被添加。如果调用session 的dowork方法之后,要重写父类的
execute方法,将setAutoCommit()方法设置为true,并且还是进行一个flush()方法的调用,比较麻烦。而且手续繁多,最要命的是不符合Hibernate的风格。所以不推荐使用。