Hibernate的所有的操作都是通過Session完成的.
基本步驟如下:
1:通過配置文件得到SessionFactory:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");
//以上配置基於spring主配置文件配置的方式
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();
}
通過瞬時對象修改數據 JobBean aJob=new JobBean(); aJob.setJobId(17); aJob.setJobDesc("編輯工作1"); aJob.setMaxLvl(10); aJob.setMinLvl(10); s.update(aJob); tx.commit(); 通過持久對象修改數據 JobBean aJob=(JobBean)s.get(JobBean.class, 17); aJob.setJobDesc("編輯工作2"); tx.commit(); 持久對象脫管對象 JobBean aJob=(JobBean)s.get(JobBean.class, 17); s.evict(aJob); aJob.setJobDesc("編輯工作3"); //這個修改不會反應到數據庫 tx.commit();
刪除例子(主鍵刪除,推薦使用):(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=?";
//此處使用標准語句同樣適用:"delete from Person where id=?";
//同樣select和update都適用
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();
//Person p = new Person();
//p.setid = id;(如果傳入的只有部分數據)
session.delete(p);
tran.commit();
session.close();
}
刪除例字(持久對象->瞬時對象):
JobBean aJob=(JobBean)s.get(JobBean.class, 17); s.delete(aJob); tx.commit();
查詢例子: 查詢語句不需要事務提交
(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(hql);
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。
