hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush
- 删除方法:
新建的对象立马被删除
@Test
public void testDelete() { Teacher t = new Teacher();
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
System.out.println(t.getId());
session.getTransaction().commit(); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
}
删除指定ID的对象:
@Test
public void testDelete2() { Teacher t = new Teacher();
t.setId(2); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
}
- load, get区别:
load返回的代理对象, 真正用到对象时才发出sql语句,
get直接从数据库加载,发出sql语句, 不会延迟.
所以load必须在commit之前执行getName方法的操作.
但是get放在commit之前之后都可以.
@Test
public void testLoad() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 1); //此数字是ID System.out.println(t.getName());
session.getTransaction().commit();
//System.out.println(t.getClass());
} @Test
public void testGet() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); session.getTransaction().commit();
//System.out.println(t.getClass());
System.out.println(t.getName());
}
update:
第一种情况: 用给的detached对象来更新persistent对象.
@Test
public void testUpdate1() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); //persistent session.getTransaction().commit(); t.setName("zhanglaoshi"); //commit后, detached Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); //persistent session2.getTransaction().commit();
}
第二种情况:更新transient对象会报错
@Test
public void testUpdate2() {
Teacher t = new Teacher();
t.setName("zhanglaoshi");
Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t);
session2.getTransaction().commit();
}
第三种情况, 手动设置ID后update, 数据库有对应记录
@Test
public void testUpdate3() {
Teacher t = new Teacher();
t.setId(3);
t.setName("zhanglaoshi"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); session2.getTransaction().commit();
}
第四种情况: 我们在update的时候, 没有设置别的字段, 但是控制台把所有字段都输出了,效率低下.
一个persistent状态的对象只要设定不同字段, 就会更新:
@Test
public void testUpdate4() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); //Persistent状态
t.setName("zhangsan2"); //缓存和数据库内容不一致, commit时统一
session.getTransaction().commit();
}
最后都没有得到我们想要的效果: 只更新想改变的字段, 有3种方法:
1. xml和annotation设置
annotation方法:Teacher.java里不想更新的字段的get方法前,加入@Column(updatable=false)
xml方法: <property name="title" update=false> </property>
2. 使用xml的dynamic-update,
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
3. 推荐!!! HQL (EJBQL)
注意: update后面的Student是对象, 不是表名
@Test
public void testUpdate7() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");
q.executeUpdate();
session.getTransaction().commit();
}
saveorupdate:
@Test
public void testSaveOrUpdate() { Teacher t = new Teacher();
t.setName("t3");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.saveOrUpdate(t); //没有id所以执行的是save session.getTransaction().commit(); t.setName("t7"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.saveOrUpdate(t); //将上面插入的t3update成t7
session2.getTransaction().commit(); }
clear方法: 清除缓存, 不喝数据库打交道. 如果不用clear的话, getName就调用一次select语句, 因为缓存已经存在了
不管get还是load都会先查一级缓存, 缓存没有才会去数据库查找, 所以clear就是清除session缓存
@Test
public void testClear() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 4);
System.out.println(t.getName()); session.clear(); Teacher t2 = (Teacher)session.load(Teacher.class, 4);
System.out.println(t2.getName());
session.getTransaction().commit(); }
flush方法: 强制内存到数据库的同步
@Test
public void testFlush() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 4);
t.setName("tt"); session.flush();
t.setName("ttt");
session.getTransaction().commit();
}
hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush的更多相关文章
- Hibernate Session对象核心方法
1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...
- hibernate Session的CRUD操作
使用Session里面的方法进行CRUD操作 (1) 增加 save 方法 (2) 查找 get 方法(根据id查) (3) 修改 update 方法 (4) 删除 delete 方法 1.增加 /* ...
- 菜鸟学SSH(九)——Hibernate——Session之save()方法
Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中.通过save()将持久化对象保存到数据库需要经过以下步骤: 1,系统根据指定的ID生成策略,为临 ...
- hibernate中save()、get()、load()、update()、saveorupdate()、merge()等方法
1.save()方法 直接传个user对象 session.save(user); 2.get()方法和load()方法 get(): 传id session.get(UserInfo. ...
- Session中的方法
Session 管理一个数据库的任务单元,即管理数据库中的增删改查操作,提交事务. 方法CRUD:save(),delete(),load(),get(),update(),saveOrUpdate( ...
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate的懒加载session丢失解决方法
在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <fi ...
- SSH项目过一段时间之后再访问会报一次Could not open Hibernate session for transaction 异常,Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlyi,再重新方法即可访问成功(通常出现在过了一晚之后再去访问系统)
前端时间到客户那去进行项目的上线测试,将项目部署好之后,运行都是正常的,可是每到了第二天早上访问的时候,就会报一个Could not open Hibernate session for transa ...
- hibernate的集中持久化方法的区别
一.预备知识 在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient.persistent.detached 下边是常见的翻译办法: transient:瞬态或者自由态 ...
随机推荐
- Android ListView 中的checkbox
Q:ListView + CheckBox 当上下滚动的时候有事会自动选中或取消 A:这个与ListView的缓存机制有关.当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图, ...
- ubuntu 14.04安装postgresql最新版本
官网:https://www.postgresql.org/download/linux/ubuntu/ ----------------------------------------------- ...
- Spring Boot 系列教程14-动态修改定时任务cron参数
动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...
- php取随机数 explode劫取字符串 时间定义随机数
php取随机数 <?phpfunction randomkeys($length){ $pattern='1234567890'; for($i=0;$i<$length;$i++) { ...
- 天天果园,中粮我买网等生鲜APP竞品分析
奈何对生鲜行业的品类,价格,供应链不熟悉,想先从APP开始来了解生鲜行业和各个生鲜企业,若有不足之处,还望海量,也请帮忙指正. 选取了以下竞品:天天果园,易果生鲜,一米鲜,中粮我买网,爱鲜蜂,每日优鲜 ...
- 用PHP实现验证码功能
目前,不少网站为了防止用户利用机器人自动注册.登录.灌水,都采用了 验证码技术.所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验 ...
- 用for、while、do-while循环输出10句“好好学习,天天向上!”
#include "stdio.h" void main() { int time; ;time<=;time++) printf("%d.好好学习,天天向上!\n ...
- Oracle Sql优化之范围处理
1.表中字段自关联与分析函数的性能比较,自关联需要扫描表两次,分析函数扫描一次即可 ----自关联 select v1.proj_id,v1.proj_start,v1.proj_end from v ...
- vue数据源转json问题
开发过程中使用到了vue框架进行前端批量数据的处理,将批量数据转换为json格式进行ajax传参时需要注意将vue数据源得到的json结果进行如下处理,webservice接收json数据时无法有效的 ...
- Warning: Cannot modify header information - headers already sent by ... functions_general.php on line 45
摘自:有用到 http://blog.csdn.net/besily/article/details/5396268 PHP错误:Warning: Cannot modify header infor ...