Hibernate插入、查询、删除操作 HQL
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的更多相关文章
- Java创建二叉搜索树,实现搜索,插入,删除操作
Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...
- [剑指offer]09用两个栈实现队列插入和删除操作,C++实现
原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...
- Hibernate 插入,修改,删除,查询语句
/* *具体操作hibernate的类 *增加,删除,修改,按ID查询,模糊查询,查询全部 **/ public class PersonOperate { //在hibernate中所有操作都是由S ...
- hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询
紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前 ...
- MyBatisPlus分页查询,删除操作
分页查询 分页查询在网页使用十分之多 原始的limit进行分页 pageHelper第三方插件 3. MP内置的分页插件 导入配置 如何使用,官网的代码如下 //分页插件 @Bean public P ...
- React---简单实现表单点击提交插入、删除操作
import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...
- sqlalchemy操作----建表 插入 查询 删除
... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import ...
- python中的MySQL数据库操作 连接 插入 查询 更新 操作
MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...
- dateframe行列插入和删除操作
ar = np.array(list("ABCDEFG")) # array只是Convert,默认会copy源值.asarray也是Convert,如果源值是array则不cop ...
随机推荐
- js 区分 safari chrome iso
网上有很多这个文章的代码,但是在区分safari chrome 没有很好的例子,因为chrome包含了 safari 毕竟他们都是wekit内核,不过利用jquery还是能区分的 在这里分享下吧 -- ...
- CSS(一):CSS简介和基本语法
一.CSS简介 1.什么是CSS CSS:Cascading Style Sheet:即层叠样式表.样式定义了如何显示HTML或XHTML元素.包括对字体.颜色.边距.高度.宽度.背景图片.网页定位等 ...
- Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;
项目部署,启动过程中有以下警告: [WARN]: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 41 ...
- mysql的navicat执行存储过程
---------------------------存储过程------------------------ BEGIN #Routine body goes here...SELECT p_in; ...
- mysql 分库分表(水平切割和垂直切割)
分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...
- 用isNaN函数来判断是否只能输入正负数字
isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果, 以判断它们表示的是否是合法的数字.当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的 ...
- 使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象
如题(“使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象”). 今天使用ffmpeg进行宿放和颜色格式转换,很简单的代码,却折腾了我一天,这里说来就气啊 ...
- 【问题】报错[CRITICAL] Rendering SLS 'base:minions.install' failed: Jinja variable 'list' object has no element 0
1.报错[CRITICAL] Rendering SLS 'base:minions.install' failed: Jinja variable 'list' object has no elem ...
- 统计 fastq 文件 q20 , GC 含量的软件
二代测序的分析过程中,经常需要统计原始下机数据的数据量,看数据量是否符合要求:另外还需要统计q20,q30,GC含量等反应测序质量的指标: 在kseq.h 的基础上稍加改造,就可以实现从fastq 文 ...
- 【Java面试题】33 HashMap和Hashtable的区别
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和n ...