zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    17.10.13
    17.10.12
    17.10.11
    17.10.10
    17.10.05
    17.10.04
    17.10.03
    17.10.02
    17.10.01
    17.9.29
  • 原文地址:https://www.cnblogs.com/end-emptiness/p/8994865.html
Copyright © 2011-2022 走看看