hibernate04--三种状态之间的转换
public class StudentTest { Session session=null;
Transaction transaction=null;
//在执行测试方法之前 先执行before
@Before
public void before(){
/**
* 01.读取核心的配置文件 在src的根目录下面! 底层规定位置!
* 在实例化Configuration对象的时候通过configure()
* 去src根目录下面,寻找hibernate.cfg.xml文件
*/
Configuration configuration=new Configuration().configure();
//02.创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//03.打开session
session = sessionFactory.openSession();
//04.开启事务
transaction= session.beginTransaction();
} //在执行测试方法之后
@After
public void after(){
//07.提交事务 sql语句 整体的执行!
transaction.commit();
//08.关闭session
session.close();
//sessionFactory.close(); 验证hbm2ddl中的create-drop
} /**
* hibernate对象的三种状态!
* 01.瞬时状态(临时状态/自由状态)
* 我们通过new关键字 创建出的一个实体对象!和hibernate没有半毛钱关系!
*
* 02.持久状态
* 对象正在被session管理,数据库中有对象 对应的数据!
* 如果对象是持久状态! 那么对它的修改操作 不需要再使用其他的方法(update)
* 在commit的时候,会执行flush(),
* flush()的时候会进行缓存清理!
* 缓存清理的时候会进行脏检查!
* 如果对象的属性和之前的对象属性不一致!
* 那么当前的对象就是脏对象!
* 就会把脏对象同步到数据库!
*
* 03.游离状态(脱管状态)
* 曾经被session管理过!和瞬时状态的区别就是 是否存在OID(主键标识符)!
*
*/ @Test
public void testSave1(){
//创建一个对象
Student stu=new Student(100, 50, "老白"); //瞬时状态
session.save(stu); //持久化状态
stu.setName("老白干");
/**
改变了对象的属性 这时候的stu就是脏对象 不需要执行update()
commit的时候会产生两条sql语句!
01.insert
02.update
*/
} @Test
public void testSave02(){
//创建一个对象
Student stu=new Student(666, 50, "老白"); //瞬时状态
stu.setName("老白干"); //瞬时状态
session.save(stu); //持久化状态 从这里开始 才被 session管理!
} @Test
public void testSave03(){
//创建一个对象
Student stu=new Student(555, 50, "老白"); //瞬时状态
stu.setName("老白干"); //瞬时状态
session.save(stu); //持久化状态 从这里开始 才被 session管理!
stu.setName("老白干1");
stu.setName("老白干2");
stu.setName("老白干3");
/**
* 还是两条sql语句
*commit的时候会产生两条sql语句!
01.insert
02.update
*/
} /**
* 测试方法的前提环境三种情况
* 01.stu对象在数据库中没有对应的数据
* 02.stu对象在数据库中有对应的数据,但是我们没有修改属性
* 03.stu对象在数据库中有对应的数据,我们修改了属性
* 产生的结果都是一致的!
* 根据id 产生update语句
*/
@Test
public void testUpdate(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.update(stu);
} /**
* 测试方法的前提环境
* stu对象在数据库中没有对应的数据
* 产生的结果:
* 01.根据id 产生 select
* 02.发现数据库中没有对应的数据 产生 insert
*/
@Test
public void testSaveOrUpdate(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.saveOrUpdate(stu);
} /**
* 测试方法的前提环境
* 01.stu对象在数据库有对应的数据
* 02.没有改变stu对象的属性值
* 产生的结果:
* 根据id 产生 select语句
*/
@Test
public void testSaveOrUpdate2(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.saveOrUpdate(stu);
} /**
* 测试方法的前提环境
* 01.stu对象在数据库有对应的数据
* 02.改变了stu对象的属性值
* 产生的结果:
* 01.根据id 产生 select
* 02.因为修改了对象的属性 所以 执行update
*/
@Test
public void testSaveOrUpdate3(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
stu.setName("老白干");
session.saveOrUpdate(stu);
} }
package cn.bdqn.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.bdqn.bean.Student; public class StudentTest { Session session=null;
Transaction transaction=null;
//在执行测试方法之前 先执行before
@Before
public void before(){
/**
* 01.读取核心的配置文件 在src的根目录下面! 底层规定位置!
* 在实例化Configuration对象的时候通过configure()
* 去src根目录下面,寻找hibernate.cfg.xml文件
*/
Configuration configuration=new Configuration().configure();
//02.创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//03.打开session
session = sessionFactory.openSession();
//04.开启事务
transaction= session.beginTransaction();
} //在执行测试方法之后
@After
public void after(){
//07.提交事务 sql语句 整体的执行!
transaction.commit();
//08.关闭session
session.close();
//sessionFactory.close(); 验证hbm2ddl中的create-drop
} /**
* hibernate对象的三种状态!
* 01.瞬时状态(临时状态/自由状态)
* 我们通过new关键字 创建出的一个实体对象!和hibernate没有半毛钱关系!
*
* 02.持久状态
* 对象正在被session管理,数据库中有对象 对应的数据!
* 如果对象是持久状态! 那么对它的修改操作 不需要再使用其他的方法(update)
* 在commit的时候,会执行flush(),
* flush()的时候会进行缓存清理!
* 缓存清理的时候会进行脏检查!
* 如果对象的属性和之前的对象属性不一致!
* 那么当前的对象就是脏对象!
* 就会把脏对象同步到数据库!
*
* 03.游离状态(脱管状态)
* 曾经被session管理过!和瞬时状态的区别就是 是否存在OID(主键标识符)!
*
*/ @Test
public void testSave1(){
//创建一个对象
Student stu=new Student(100, 50, "老白"); //瞬时状态
session.save(stu); //持久化状态
stu.setName("老白干");
/**
改变了对象的属性 这时候的stu就是脏对象 不需要执行update()
commit的时候会产生两条sql语句!
01.insert
02.update
*/
} @Test
public void testSave02(){
//创建一个对象
Student stu=new Student(666, 50, "老白"); //瞬时状态
stu.setName("老白干"); //瞬时状态
session.save(stu); //持久化状态 从这里开始 才被 session管理!
} @Test
public void testSave03(){
//创建一个对象
Student stu=new Student(555, 50, "老白"); //瞬时状态
stu.setName("老白干"); //瞬时状态
session.save(stu); //持久化状态 从这里开始 才被 session管理!
stu.setName("老白干1");
stu.setName("老白干2");
stu.setName("老白干3");
/**
* 还是两条sql语句
*commit的时候会产生两条sql语句!
01.insert
02.update
*/
} /**
* 测试方法的前提环境三种情况
* 01.stu对象在数据库中没有对应的数据
* 02.stu对象在数据库中有对应的数据,但是我们没有修改属性
* 03.stu对象在数据库中有对应的数据,我们修改了属性
* 产生的结果都是一致的!
* 根据id 产生update语句 ! 只能是从游离变持久!
*/
@Test
public void testUpdate(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.update(stu);
} /**
* 测试方法的前提环境
* stu对象在数据库中没有对应的数据
* 产生的结果:
* 01.根据id 产生 select
* 02.发现数据库中没有对应的数据 产生 insert
*/
@Test
public void testSaveOrUpdate(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.saveOrUpdate(stu);
} /**
* 测试方法的前提环境
* 01.stu对象在数据库有对应的数据
* 02.没有改变stu对象的属性值
* 产生的结果:
* 根据id 产生 select语句
*/
@Test
public void testSaveOrUpdate2(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.saveOrUpdate(stu);
} /**
* 测试方法的前提环境
* 01.stu对象在数据库有对应的数据
* 02.改变了stu对象的属性值
* 产生的结果:
* 01.根据id 产生 select
* 02.因为修改了对象的属性 所以 执行update
*/
@Test
public void testSaveOrUpdate3(){
//创建一个对象
Student stu=new Student(1, 50, "老白"); //瞬时状态
stu.setName("老白干");
session.saveOrUpdate(stu);
} /**
* 测试方法的前提环境
* stu对象在数据库没有对应的数据
* 产生的结果:
* 两条sql
* 01.select 先去数据库中查询有没有id对应的数据
* 02.执行 insert
*/
@Test
public void testMerge01(){
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.merge(stu);
}
/**
* 测试方法的前提环境
* stu对象在数据库有对应的数据 ,我们没有修改对象的属性
* 产生的结果:
* 只有select语句
*/
@Test
public void testMerge02(){
Student stu=new Student(1, 50, "老白"); //瞬时状态
session.merge(stu);
} /**
* 测试方法的前提环境
* stu对象在数据库有对应的数据 ,我们修改了对象的属性
* 产生的结果:
* 01.select
* 02.update
*/
@Test
public void testMerge03(){
Student stu=new Student(1, 50, "老白"); //瞬时状态
stu.setName("老白干");
session.merge(stu);
} /**
* 测试方法的前提环境
* stu对象在数据库有对应的数据 ,我们修改了对象的属性
* 产生的结果:
* 报错
*/
@Test
public void testMerge04(){
Student stu=new Student(1, 50, "老白干"); //瞬时状态
session.merge(stu); //不会改变对象的状态
stu.setName("老白11111"); //瞬时状态
session.update(stu); //报错
} /**
* save(): 把瞬时状态转换成 持久状态
* update():把游离状态转换成 持久状态
* saveOrUpdate():
* 会根据持久化对象的主键标识符来判断是执行save()还是update()
* 如果没有oid,证明是瞬时状态,就执行save();
* 如果有oid,证明是游离状态,就执行update();
* merge: 虽然和saveOrUpdate()产生的sql结果一致!
* 但是:
* 01.merge不会改变对象的状态!
* 02.当对象处于瞬时状态的时候,会将对象赋值一份到session的缓存中,执行save() ,产生insert语句!
* 我们认为 产生了 insert语句,stu就变成了持久化对象!其实不是!
* 只不过是session缓存中的对象发生了变化!
*/ }
/**
* 第一步:
*01.读取配置文件 hibernate.cfg.xml
*02.创建会话工厂---》确保工厂是单例模式
*03.提供对外访问的接口
*第二步:
* 在核心配置文件中 管理我们的currentSession
*/
public class HibernateSessionUtil {
private static Configuration configuration;
private static SessionFactory sessionFactory; private HibernateSessionUtil(){}//私有化构造 //在类被加载的时候 执行静态代码块
static{
configuration=new Configuration().configure();
sessionFactory=configuration.buildSessionFactory();//获取会话工厂
} //获取session的方法
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
} }
hibernate.cfg.xml文件中新增
<!-- 配置我们的currentSession -->
<property name="current_session_context_class">thread</property>
测试代码
public class SessionTest { public static void main(String[] args) {
/**Configuration configuration=new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession(); //第一次
System.out.println(session.hashCode());
session = sessionFactory.openSession(); //第二次
System.out.println(session.hashCode()); hashCode不一致
*/ //通过我们自己创建的回话工厂来创建currentSession
Session session = HibernateSessionUtil.getCurrentSession(); //第一次
System.out.println(session.hashCode());
session = HibernateSessionUtil.getCurrentSession(); //第二次
System.out.println(session.hashCode()); //hashCode一致
} }
/**
* flush和commit的区别!
*
* 相同点:
* 两者都会同步到数据库!
*
* 不同点:
* commit:永久保存! commit--->flush()-->缓存清理--->脏检查
*
* flush: 不会永久保存!
* 01.是执行缓存清理工作!
* 02.会把缓存中的对象同步到数据库中!但是不会保存!
* 03.确保缓存中的数据 和数据库中的数据一致!
*
* 缓存清理机制:
* 在我们执行flush()的时候,会清理session中的数据!
* 在清理缓存的的时候,会执行脏检查!
* 脏检查:
* 在对象被session管理的时候!
* 01.session会在缓存中创建出 对象的快照保存现在对象的一个状态以及属性! (a对象)
* 02.在清理缓存的时候会把现在对象的属性和(a对象)进行比对!
* 03.发现现在的对象和(a对象不一致!那么现在的对象就称之为 脏对象!
* 04.flush()会把这个脏对象 同步到 数据库! 但是不会保存!只是暂时的!
* 05.之后commit的时候 才能永久保存数据!
*
*/
@Test
public void test01(){
//通过工具类获取session
Session session = HibernateSessionUtil.getCurrentSession();
//获取事务
Transaction transaction = session.beginTransaction();
Student stu=(Student) session.get(Student.class, 1);//持久化对象
stu.setName("能改变吗?");
/**
* 清理缓存
* 按照我们的理解,没有commit是不可能提交事务的!言外之意!数据库中的数据不会改变!
*/
System.out.println("*****************");
session.flush();
stu.setName("能改变吗2?");
System.out.println("*****************");
Student stu2=(Student) session.get(Student.class, 1);
System.out.println(stu2.getName()); //已经改变了!
} @Test
public void test02(){
//通过工具类获取session
Session session = HibernateSessionUtil.getCurrentSession();
//获取事务
Transaction transaction = session.beginTransaction();
Student stu=(Student) session.get(Student.class, 1);//持久化对象
stu.setName("能改变吗?");
System.out.println("*****************");
session.flush(); //执行 sql
stu.setName("能改变吗2?"); //之后又改变了 值
System.out.println("*****************");
/**
* 缓存中的OID是一致的!
* get()
* 01.查询session缓存
* 02.发现缓存中有数据 直接使用
* 03.所以说 stu2的name必须是 “ 能改变吗2?”
*/
Student stu2=(Student) session.get(Student.class, 1);
System.out.println(stu2.getName()); //改变了第2次!! !
}
hibernate04--三种状态之间的转换的更多相关文章
- 【转】Notepad++中Windows,Unix,Mac三种格式之间的转换
原文网址:http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_func_windows_unix_mac.ht ...
- 【SSH】——Hibernate三种状态之间的转化
Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...
- 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换
由于历史原因,导致Windows,Unix/Linux,Mac三者之间,对于文件中所用回车换行符,表示的方法,都不一样. 这就导致了很多人都会遇到回车换行符的困惑,和需要在不同格式间进行转换. 其中, ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- Hibernate延迟加载、三种状态、脏检查 缓存
一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...
- Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/24256091 Session操作过程中的po ...
- Hibernate[延迟加载] [三种状态] [脏检查] [缓存机制]
一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...
- java对象中的三种状态和脏检查及刷新缓存机制
瞬时状态 瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于 瞬时状态的ava对象是 ...
- Hibernate实体对象的生命周期(三种状态)
瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...
随机推荐
- Netty buffer缓冲区ByteBuf
Netty buffer缓冲区ByteBuf byte 作为网络传输的基本单位,因此数据在网络中进行传输时需要将数据转换成byte进行传输.netty提供了专门的缓冲区byte生成api ByteBu ...
- ChartControl控件0和null的效果
DevExpress的ChartControl虽然还不能完全代替Office图表(例如它暂时不支持添加数据表),但它算同类产品中相当优秀的了,下面是对0值和空值的处理. DataTable zeroD ...
- 【技能意志矩阵-skill will matrix】工作中究竟是个人能力更重要,还是我们的积极性更能提高我们的业绩?
工作中究竟是个人能力更重要,还是我们的积极性更能提高我们的业绩? 我们可以通过建立“个人能力(即技能)”和“积极性(即意志)”的矩阵(skill will matrix),找到自己的象限,并根据指导意 ...
- css3 的calc
css中宽高位置什么的现在可以在样式中直接使用calc计算了 https://www.w3cplus.com/css3/how-to-use-css3-calc-function.html 运算符前后 ...
- EAS开发报错 :数据库表 或 视图 不存在
一:原因分析 建模之后,发布数据时未能及时在数据库创建相应的表格或视图. 二:解决办法 建模视图下——右键模型——更新数据库. 三:名称字段.描述字段在数据库里的存储格式 ...
- 分析轮子(十)- HashMap.java 之概念梳理
注:玩的是JDK1.7版本 一:还是原来的风格,先上一下类的继承关系图,这样能够比较清楚的知道此类的相关特性 二:HashMap.java 的代码比较难看,所以,我看了几天,写的话也分开来写,这样能表 ...
- (七):处理MFC
(一):简单介绍 为了可以在一个Winelib应用中使用MFC,你须要首先使用Winelib又一次编译MFC. 在理论上,你应该为Windows的MFC编写一个封装(怎样编写在后面介绍).可是,在实践 ...
- glide引出恶心的git submodule
起因 某一天一个同事,在看那个glide,然后我路过,看到他为何不编译“glide”项目(他说,编译中出错,反正都是看源码而已,所以就懒得搞,然后我出于“好心”,给他弄一下,我擦) 报错: Pro ...
- webpack的配置文件
1.路径 __dirname是一个全局变量,在项目html和js中没有单独定义,直接写就可以得到项目的根目录的路径 module.exports={ // __dirname是nodejs里的一个全局 ...
- Oracle 傻瓜式数据归档
推荐用方法二 方法一 [本库备份,分区表需要另写CREATE TABLE方法] ----------------------------------------------- ; ; ; ; RENA ...