一、将读取配置文件和开启事务抽象为一个工具类方便以后操作。
public class HibernateUtil {
private static Configuration cfg=null;
private static SessionFactory factory=null;
private static Session session = null;
static{
cfg = new Configuration().configure();
factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());
}
public static Session getSession(){
if(factory!=null)
return session=factory.openSession();
factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());
return session=factory.openSession();
}
public static void closeSession(){
if(session!=null&&session.isOpen())
session.close();
}
}
二、用junit测试
@Test
public void testSave(){
Session session = null;
Transaction tx = null;
User user = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
user = new User();
user.setName("吴京");
user.setPwd("111");
session.save(user);
//在持久状态下;脏数据检查:当提交事务,清理缓存时发现session中数据
//和数据库中数据不一致时,将会把session中的数据更新到数据库中
user.setName("萝莉");
//在保存以后再修改对象,那么会产生多天sql语句,效率较低,一般在save前修改
session.flush();
tx.commit();//若只刷新不提交数据将不能把脏数据检查发现的数据存到数据库中
} catch (Exception e) {
e.printStackTrace();
System.out.println("抛出异常!");
tx.rollback();
}finally {
HibernateUtil.closeSession();
}
//游离状态
System.out.println("姓名:"+user.getName());
}
执行结果:
执行后发现有两条sql语句。
数据库中保存的是“萝莉”而不是“吴京”,说明在提交事务的时候回进行脏数据检查时,将session中的数据保存到数据库中。