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:瞬态或者自由态 ...
随机推荐
- 字符函数库 cctype
<cctype> (ctype.h) Character handling functions This header declares a set of functions to cla ...
- NSObject Class 浅析
Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议.而其中NSObject类采用了NSObject协议.在本文中,我们主要整理一下NSObject类 ...
- 关于前台主键输入错误对后台hibernate方法的影响
由于前台输入时开始不小心打错了主键为value=“${conf_id}”/ 导致后台得到的主键不是数字“1”而是“1/”所以到后台就算是进的updata方法结果运行的却是添加方法 原因可能是传入的对象 ...
- PAT (Advanced Level) 1108. Finding Average (20)
简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- 十二月总结-and-2016年终总结
回顾 今天是2016的最后一天了,所以今天来做一个年终总结是最好不过的了.各种期末考试随着而来,也就意味着在工大的第一个学期马上结束了.回顾一下这一年所获得或者失去的一些东西: 2月份在家焦虑的等待着 ...
- editplus 正则删换行
editplus regular expression ctrl+h 1.替换开始是空行 ^[\t ]*\n 2.替换换行 \n 3.替换包含某字符 .*@126.* excel去重复(或者保留一个 ...
- L9,a cold welcome
expression: a large crowd of 一大群 in twenty minutes’time 20分钟之后 一些时间使用的介词 in two year‘s time on Satur ...
- L4,an exciting trip
expressions: a great number of 许多 in the centre of 在…的中部 sentences: I have just had breakfast. I hav ...
- opencv 相关一个很好的博客
http://blog.csdn.net/zouxy09/article/category/1218765 图像卷积与滤波的一些知识点 图像卷积与滤波的一些知识点zouxy09@qq.comhttp: ...
- OpenCV ——遍历图像方法
转自http://blog.csdn.net/daoqinglin/article/details/23628125 ; y < testImage->height; y++) { uch ...