一、將讀取配置文件和開啓事務抽象爲一個工具類方便以後操作。
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中的數據保存到數據庫中。