Hibernate中使用HQL語句進行增,刪,改,查


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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM