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。

Hibernate插入、查询、删除操作 HQL的更多相关文章

  1. Java创建二叉搜索树,实现搜索,插入,删除操作

    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...

  2. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  3. Hibernate 插入,修改,删除,查询语句

    /* *具体操作hibernate的类 *增加,删除,修改,按ID查询,模糊查询,查询全部 **/ public class PersonOperate { //在hibernate中所有操作都是由S ...

  4. hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询

    紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前 ...

  5. MyBatisPlus分页查询,删除操作

    分页查询 分页查询在网页使用十分之多 原始的limit进行分页 pageHelper第三方插件 3. MP内置的分页插件 导入配置 如何使用,官网的代码如下 //分页插件 @Bean public P ...

  6. React---简单实现表单点击提交插入、删除操作

    import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...

  7. sqlalchemy操作----建表 插入 查询 删除

    ... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import ...

  8. python中的MySQL数据库操作 连接 插入 查询 更新 操作

    MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...

  9. dateframe行列插入和删除操作

    ar = np.array(list("ABCDEFG")) # array只是Convert,默认会copy源值.asarray也是Convert,如果源值是array则不cop ...

随机推荐

  1. docker 部署nginx+weblogic集群

    測试一段时间.再来报告

  2. ansible result.stdout.find('running') != -1 判断状态

    [root@m01 ansible-playbook]# cat test_1103.yml ---- hosts: webserver  tasks:    - file: path=/tmp/{{ ...

  3. 免费CA数字证书的申请、安装、导入、导出

    http://wenku.baidu.com/link?url=oDUw50eCE5zX8tmg4N3-ddYGLt1U5aJYGEN7rk_z7t6LuMHL3M4oBstYBI_dQ1UnCtcK ...

  4. cs108 04 oop design

    oop design 分为以下几个方面: - encapsulation and modularity(封装和模块化) - API/Client interface design(API 接口给调用类 ...

  5. [R语言统计]频数表

    频数表在统计学中是一个非常基本并且重要的概念,我们这里就来讲解它的基本用法. 首先我们需要载入数据,并查看数据的基本信息 install.packages('vcd') #安装vcd包,其中有可以利用 ...

  6. 搭建Grunt集成环境开发SASS

    先行下载安装Ruby和SASS 再下载并安装node.js,已经集成了NPM 命令行查看是否安装成功 node -v npm -v 命令行安装grunt npm install -g grunt-cl ...

  7. Oracle数据库表空间与用户的关系是 ( )

    Oracle数据库表空间与用户的关系是 ( )? A.一对一 B.一对多 C.多对一 D.多对多 解答: D 一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用.

  8. Java处理图片时编译不通过

    Java中处理图片时,MyEclipse需要导入以下包: import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.j ...

  9. CentOS运维常用管理操作命令

    自己整理的整理Linux常用运维和linux常用管理操作命令,当然不是非常详细和丰富,但是也基本上够用了吧.欢迎留言补充更多的Linux常用运维和linux常用管理操作命令.不断完善中.... 备份m ...

  10. CentOS6.8忘记root密码的解决办法(开始初始化也可以用)

    在开机启动的时候按键盘上的“E”键会进入如下界面. 选择相应的内核,再次按“E”,出现下图,选择第二项,再次按“E”键 经过第二步,这个画面可以编辑,在信息的最后加“空格”,然后键入“single”( ...