轉自:原地址
Hibernate的所有的操作都是通過Session完成的.
基本步驟如下:
1:通過配置文件得到SessionFactory:
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
2:通過SessionFactory 得到一個Session
Session session=sessionFactory.openSession();
3:通過session進行插入,刪除,修改以及查詢.
插入例子:(1)聲明一個事務;(2)Session執行save()操作;(3)事務提交;(4)關閉Session,可選.
public void insert(Person p){
Transaction tran=session.beginTransaction();
session.save(p);
tran.commit();
// session.close();
}
修改例子:(1)聲明一個事務;(2)Session執行update()操作;(3)事務提交;(4)關閉Session,可選.
public void update(Person p){
Transaction tran=session.beginTransaction();
session.update(p);
tran.commit();
// session.close();
}
刪除例子(主鍵刪除,推薦使用):(1) 聲明刪除的SQl語句;(2)創建session的Query對象;(3)設置Query對象的參數;(4)執行Query的executeUpdate()操作;(5)Session事務提交
public void delete(int id){
String hql=”delete Person as p where p.id=?”;
Query query=session.createQuery(hql);
query.setInteger(0,id);
query.executeUpdate();
session.beginTransaction().commit();
}
刪除例子(對象刪除):(1)聲明一個事務;(2)Session執行delete()操作;(3)事務提交;(4)關閉Session,可選.
public void delete(Person p){
Transaction tran = session.beginTransaction();
session.delete(p);
tran.commit();
session.close();
}
查詢例子:(跟刪除差不多) 查詢語句不需要事務提交
(1) 聲明刪除的SQl語句;(2)創建session的Query對象;(3)設置Query對象的參數;
public Persion queryById(int id){
String hql=”from Person as p where p.id=?”;
Query query=session.createQuery();
query.setInteger(0,id);
List rsList=query.list();
iterator it=rsList.iterator();
Person person=null;
while(it.haseNext()){
person=(Person)it.next();
}
return person;
}
session.delete()- -
session.delete(obj)將obj的狀態變爲transient。兩種情況
1)obj是session的cache裏邊的cache沒有的,比如:
session.delete(new Employee(4));
2)obj存在於session的cache中,比如:
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
session.delete(employee);
這兩種情況都是允許的,hibernate都會發送一條delete語句給數據庫。
delete執行之後,如果調用了session.load(), 又可以分爲兩種情況:
1)在session.flush()之前,如:
tx.beginTransaction();
session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));//發生在session.flush()之前
tx.commit();
那麼hibernate會拋出ObjectDeletedException:The object with that id was deleted:
2)在session.flush()之後,如:
tx.beginTransaction();
session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));
tx.commit();
tx.beginTransaction();
session.load(Employee.class, new Integer(4));//同一個session中,上面的tx.commit()將session flush了一次。
tx.commit();
那麼這個時候hibernate僅僅會拋出ObjectNotFoundException:No row with the give…
表示找不到該object。如果第二個tx裏邊採用session.get()也就不會拋出exception了。
delete執行之後,如果調用了session.save(obj):
tx.beginTransaction();
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
session.delete(employee);
System.out.println(employee);
session.save(employee);
System.out.println(employee);
tx.commit();
這種情況是完全合理的,合法的,
delete將employee從persistent的狀態變爲transient的狀態。
save將employee從transient狀態變爲persistent的狀態。
save一個被delete的obj的時候,在save處hibernate強制執行session.flush(),發送delete語句,然後按照常規的save流程來進行。爲什麼要這麼做,還沒有完全想明白。
delete執行之後,如果對obj對象屬性的修改,tx.commit()時不會進行dirtyChecking。