Java实战之02Hibernate-03Session中的常用方法
九、Session中的常用方法
1、save方法
都是临时态————>持久态
2、persist方法
作用:
持久化临时态对象。
与save方法的区别:
开始了事务:persist和save没有区别。
不开启事务:
persist:什么都不会做。
save:
hibernate3:计划保存数据,因为没有开启事务,自动回滚。
hibernate5:提供一个内置事务执行保存操作。
/*
* save方法和persist方法
* 共同点:
* 都是把临时态对象转成持久态
* 区别:
* 1、提供者不一样
* save方法是hibernate提供的
* persist方法是JPA规范提供的 Java Persistence API
* 2、在没有事务的支持下
* save方法:
* hibernate5:会用框架内置的事务执行保存操作。
* hibernate3:就会执行保存,但是没有明确的提交操作,在超时后,事务自动回滚。
* persist方法:
* 什么都不去做。
*
*/
@Test
public void test2(){
Student s1 = new Student();//临时态
s1.setName("test3");
s1.setGender("female");
s1.setBirthday(new Date()); Session s = HibernateUtil.getSession();
//Transaction tx = s.beginTransaction();
s.persist(s1);//持久态
//tx.commit();
s.close();
} @Test
public void test1(){
Student s1 = new Student();//临时态:没有OID,和session没有关系
s1.setName("test4");
s1.setGender("male");
s1.setBirthday(new Date()); Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
s.save(s1);//持久态:有OID,和session有关系
tx.commit();
s.close();
}
3、update方法
把脱管态-------->持久态
3.1、若脱管态对象的属性没有发生变化,也会执行update语句。可以在<class select-before-update="true">改变。开发中可以对于属性不经常变化的实体做此配置
解决问题:
3.2、update一个脱管态对象时,如果已经存在OID相同的持久态对象,则报错
3.3、update一个脱管态对象时,数据库不存在相应记录(被别的程序删除),亦错
/*
* update方法
* 把一个脱管态的对象转成持久态
*/
/*
* 问题3:
* 当我们持久化一个脱管态的对象时,如果该对象被别的程序删除了,则会报错
*/
@Test
public void test5(){
Session s2 = HibernateUtil.getSession();
Transaction tx2 = s2.beginTransaction();
Student student2 = s2.get(Student.class, 1);//持久态
student2.setGender("female");
s2.update(student2);//把脱管态对象转成持久态
tx2.commit();
s2.close();
}
/*
* 问题2:
* 当我们持久化一个脱管态对象时,如果在session的一级缓存之中,已经包含了有相同OID的对象,则会报错。
* 解决办法:
* 使用使用merge方法
*/
@Test
public void test4(){
Session s1 = HibernateUtil.getSession();
Transaction tx1 = s1.beginTransaction();
Student studnet1 = s1.get(Student.class,1);//持久态
tx1.commit();
s1.close(); System.out.println(studnet1);//脱管态:有OID,和Session没有关系 Session s2 = HibernateUtil.getSession();
Transaction tx2 = s2.beginTransaction();
Student student2 = s2.get(Student.class, 1);//持久态
s2.update(studnet1);//把脱管态对象转成持久态
tx2.commit();
s2.close();
} /*
* 问题1:
* 当我们使用update持久一个脱管态对象时,就算没有修改实体对象的数据,也会执行update语句。
* 解决办法:
* select-before-update
* 配置位置:映射文件的class元素上
* <class name="Student" table="student" select-before-update="true">
* 取值:
* true:在更新之前,执行查询
* false:在更新之前不执行查询。默认值
*/
@Test
public void test3(){
Session s1 = HibernateUtil.getSession();
Transaction tx1 = s1.beginTransaction();
Student s = s1.get(Student.class,1);//持久态
tx1.commit();
s1.close(); System.out.println(s);//脱管态:有OID,和Session没有关系 Session s2 = HibernateUtil.getSession();
Transaction tx2 = s2.beginTransaction();
s2.update(s);//持久态
tx2.commit();
s2.close();
}
4、saveOrUpdate方法
作用:保存或修改
临时态————>持久态:保存
脱管态————>持久态:更新
依据对象的状态来确定save还是update
特殊情况:
当在对象的映射xml文件中,<id中设置了unsaved-value>,且和OID保持一致时,就不再把对象看成游离态而是临时态。
/*
* saveOrUpdate
* 作用:
* 执行保存或者更新
* 执行依据:
* 依据的是对象的状态。
* 如果对象是临时态,则执行save
* 如果对象是脱管态,则执行update
*/
@Test
public void test8(){
Student s1 = new Student();//临时态:没有OID,和session没有关系
s1.setName("test5");
s1.setGender("male");
s1.setBirthday(new Date());
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
s.saveOrUpdate(s1);//持久态:有OID,和session有关系
tx.commit();
s.close();
}
@Test
public void test7(){
Session s2 = HibernateUtil.getSession();
Transaction tx2 = s2.beginTransaction();
Student student2 = s2.get(Student.class, 2);//持久态
student2.setGender("male");
s2.saveOrUpdate(student2);//把脱管态对象转成持久态
tx2.commit();
s2.close();
}
5、merge方法
update一个游离对象时,如果已经存在OID相同的持久态对象,则报错。可以使用merge合并,把游离对象的内容拷贝到内存中OID一样的对象的属性中
/*
* merge方法:
* 作用:合并两个对象。用脱管态对象的数据去替换持久态对象的数据。
*/
@Test
public void test6(){
Session s1 = HibernateUtil.getSession();
Transaction tx1 = s1.beginTransaction();
Student studnet1 = s1.get(Student.class,2);//持久态
tx1.commit();
s1.close(); System.out.println(studnet1);//脱管态:有OID,和Session没有关系 Session s2 = HibernateUtil.getSession();
Transaction tx2 = s2.beginTransaction();
Student student2 = s2.get(Student.class, 2);//持久态
s2.merge(studnet1);//把脱管态对象转成持久态
tx2.commit();
s2.close();
}
Java实战之02Hibernate-03Session中的常用方法的更多相关文章
- Java中的常用方法
Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s).后缀 endsWit ...
- Java多线程中的常用方法
本文将带你讲诉Java多线程中的常用方法 Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...
- Scala 深入浅出实战经典 第48讲:Scala类型约束代码实战及其在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
- 「小程序JAVA实战」springboot的后台搭建(31)
转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...
- sun.misc.Unsafe中一些常用方法记录
sun.misc.Unsafe中一些常用方法记录 前情摘要 sun公司提供了可以用于直接操作内存的类,这个类就是sun.misc.Unsafe.因为Java本身是不会涉及到直接操作内存的,Java A ...
- 测试Thread中的常用方法
package com.yhqtv.java; /* *测试Thread中的常用方法: * 1.start():启动当前线程:调用当前线程的run() * 2.run():通常需要重写Thread类的 ...
- Day10_48_Map集合中的常用方法
Map集合中的常用方法 * 常用方法 - 注意 Map集合中的key是无序不可重复的set集合,如果添加数据时,key值重复了,后面添加的重复数据也是可以添加成功的,但是会覆盖前面相同的数据. 1. ...
随机推荐
- Idea的Git使用
在使用Git来pull和push代码的时候会发生冲突的情况,如果处理不当则会出现无法pull和push代码的情况.所以这个是十分有必要注意的. 那么我来说几句自己的总结吧: 1.先看下idea的Git ...
- C#- Winform调用BAT例子
前段时间在工作的时候需要用到,百度了好久后找,可是找到了又希望调用的时候窗体不要显示出来. proc.StartInfo.CreateNoWindow = true; proc.Start ...
- WIN32不得不会:视频播放器
我愿分享我所有的技术,你可愿意做我的朋友? ----赵大哥 为何要写这篇博客 纯WIN32API打造,自认为对底层的理解略有帮助,和大家分享成果和知识点. 已经实现功能有:打开.播放.关闭功能. 核心 ...
- ios引导页 设定以及 图片尺寸
iphone的屏幕尺寸有着几种: iphone 4/4s: 3.5 寸 分辨率:640X960 高宽比 640/960 = 1.5 iphone 5/5c/5s:4 寸 分辨率:640X1136 ...
- 封装的多功能多效果的RecyclerView
开源界有一句很有名的话叫"不要重复发明轮子",当然,我今天的观点不是要反驳这句话,轮子理论给我们的开发带来了极大的便利,.但我想说的是,既要会用轮子,也要知道轮子怎么造,必要的时候 ...
- java异步任务处理
1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...
- 【10】令operator=返回一个reference to *this
1.令operator= 返回一个reference to *this,为什么? 这只是一个协议,并无强制性.但是,为了与基本类型的行为保持一致性,强烈建议这么做.设计class 有一个宝典:一旦有疑 ...
- Centos 7 yum 安装Apache
1.首先查看是否已经安装 rpm -qa httpd 2.如果没有 yum install httpd -y rpm -ql httpd 查看 3 ...
- [React Native] Using the WebView component
We can access web pages in our React Native application using the WebView component. We will connect ...
- 图片轮换cycle插件的运用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...