一 简介
1、hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式,所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
2、如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式。(注意:通常并不推荐这样做)
二 当将开启事务和提交事务关闭
public void init(){
// 创建配置对象
Configuration config = new Configuration().configure();
//config.addClass(Students.class);
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
session = sessionFactory.openSession();
// 开启事务
//transaction = session.beginTransaction();
}
@After
public void destory(){
// 提交事务
//transaction.commit();
// 关闭会话
session.close();
// 关闭会话工厂
sessionFactory.close();
}
不开启事务就不能将对象保存到数据库中!
控制台输出:
Hibernate:
drop table if exists STUDENTS
Hibernate:
create table STUDENTS (
SID integer not null,
SNAME varchar(255),
GENDER varchar(255),
BIRTHDAY datetime,
ADDRESS varchar(255),
primary key (SID)
)
九月 17, 2017 5:35:15 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
三 设置自动提交方式
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();
//config.addClass(Students.class);
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
session = sessionFactory.openSession();
// 开启事务
//transaction = session.beginTransaction();
}
@After
public void destory(){
// 提交事务
//transaction.commit();
// 关闭会话
session.close();
// 关闭会话工厂
sessionFactory.close();
}
@Test
public void testSaveStudents(){
Students s= new Students(1,"张三丰","男",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();
}
}
控制台输出:
Hibernate:
drop table if exists STUDENTS
Hibernate:
create table STUDENTS (
SID integer not null,
SNAME varchar(255),
GENDER varchar(255),
BIRTHDAY datetime,
ADDRESS varchar(255),
primary key (SID)
)
九月 17, 2017 5:46:00 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate:
insert
into
STUDENTS
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)