http://adoze.bokee.com/viewdiary.25672393.html

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。
       这个道理比较显然,这些思想不是完全正确的,还是要更具自己的实际的情况来看到底是怎么一回事.这个记录是在别人那里抄来的,当时都没有想太多,所以犯了很多错误,但是后来的时候还是给了我很大的帮助,至少我的问题给我解决了,只是换了一种方式!所以我还是很感谢这位朋友所以把这个帖出来!

=====

public   Collection   findBySQL(String   sql){
      Session   session   =   null;
      Transaction   tran   =   null;
      Collection   list   =   null;
      try   {
          session   =   sessionFactory.openSession();
          tran   =   session.beginTransaction();
          SQLQuery   sq   =   session.createSQLQuery(sql);
          sq.addEntity(Student.class);
          list   =   sq.list();
          tran.commit();
      }   catch   (HibernateException   e)   {
          e.printStackTrace();
          tran.rollback();
      }finally{
          if(session!=null)
          session.close();
      }
      return   list;
}

直接用SqlQuery好像不能直接执行 增 删 改 操作,不过,我找了一下,下面的方法可以的。

trans = session.beginTransaction();
Connection conn = session.connection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
stmt.execute();
trans.commit();

Hibernate插入、查询、删除操作 HQL or SQL相关推荐

  1. 多表(三个表)插入与删除操作

    业务需求: 新增和删除分类信息,以category为主表,category_detail和image为副表,在不额外编写Sql.mapper.xml文件的前提下,利用mybatis-plus中的内置函 ...

  2. c语言二叉排序树的创建与查找,C语言实现二叉查找树的插入和删除操作问题求教...

    使用C语言实现二叉查找树的插入和删除操作,但在 return searchBST( T->rchild, val, f, p);出错.这里应该使用了双指针,求教应该怎么改才正确. /* +--- ...

  3. 彻底理解面试难点之rb-tree(红黑树)续--对红黑树的插入和删除操作的一些理解!!!

    这里主要讲一下对红黑树的插入和删除操作的一些理解 对于红黑树的一些相关性质的介绍,上篇已经讲了,这里不再介绍,有需要了解的,可以翻前面的博客看看. 1.红黑树的插入操作 对于红黑树的元素插入,我们首先 ...

  4. c语言链表的插入 查询 删除

    c语言实验十五链表 链表的插入 查询 删除, 不会吧,来看看月腾兄的: #include<stdio.h> #include<stdlib.h> struct node {in ...

  5. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  6. 数据结构单链表插入和删除操作

    单链表:先回顾单链表的特点  逻辑相邻 物理上不一定相连 首先初始化单链表,其中主要保存的是该节点自身的值以及下个节点的地址. 有效节点结构体设计: ​ struct Node{ ​ int data ...

  7. 如何实现双向链表的插入、删除操作

    如何实现双向链表的插入.删除操作 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N).如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的 ...

  8. 数据结构—线性表顺序存储插入和删除操作

    线性表的操作:1.InitList(*L):初始化操作,建立一个空的线性表L 2.ListEmpty(L):判断线性表是否为空,如果为空,返回true,否则返回false 3.ClearList(*L ...

  9. 红黑树及其插入、删除操作

    在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...

最新文章

  1. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
  2. onnx:Resize in opset 11 to support Pytorch‘s behavior
  3. 管中窥“视频”,“理解”一斑 —— 视频理解概览
  4. 用户体验改善案例_用户体验案例研究:建立更好的体验(重新设计“和平航空”网站)...
  5. mysql索引1908
  6. word自带公式右侧编号
  7. 通信upf是什么意思_中兴通讯全场景UPF 极简设计,随需而动
  8. vue 页面保存为本地图片
  9. 利用assimp显示gltf
  10. 目标检测评估指标 mAP P R
  11. Python 分类算法(1)——逻辑回归logistic regression之代码实现(2)
  12. linux服务器如何查看mac地址,linux如何查看mac地址_查看mac地址 linux_linux查看mac地址...
  13. 理解计算机(2)—什么是云主机
  14. 谈谈JS二进制:File、Blob、FileReader、ArrayBuffer、Base64
  15. pr预设的卷及内核锐化是什么_PR内置特效合集
  16. ​包载紫杉醇的tpgs还原性白蛋白纳米粒/GA-HSA 藤黄酸人血清蛋白纳米粒​
  17. MySQL 数据库存储引擎
  18. document.getElementById(“id”)与$(#id)的区别
  19. iqc工作职责和工作内容_iqc是什么意思 iqc的工作职责是什么
  20. 智能叮当值不值得长期做?

热门文章

  1. Metal之加载TGA与PNG/JPEG纹理图片
  2. 10.Vue 组件基础
  3. 2019\Province_C_C++_B\试题E-迷宫
  4. 安装好Pycharm后如何配置Python解释器简易教程(configure python interpreter)
  5. 2013年第四届蓝桥杯C/C++ A组国赛 —— 第五题:网络寻路
  6. 计算机精英协会考核题 —— 第三题:斐波那契数
  7. 【Qt】QLayoutItem类
  8. 【Qt】Qt登录对话框(设计器实现)
  9. 【STM32】STM32F4时钟系统
  10. 【Linux系统编程】特殊进程之守护进程