Hibernate -- 操作持久化对象
知识点2: session概述
Session 接口是
Hibernate 向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新,
删除和加载Java对象的方法.
知识点3:理解session的缓存
接口的实现中包含一系列的 Java
集合, 这些Java集合构成了
Session缓存.只要Session
实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期
知识点4:清理session的缓存
Session能够在某些时间点,按照缓存中对象的变化来执行相关的
SQL语句,
来同步更新数据库,这一过程被称为清理缓存(flush)
在以下时间点清理缓存:
Transaction 的 commit()方法的时,该方法先清理缓存(session.flush()),然后在向数据库提交事务(tx.commit())
flush:进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一些列sql语句,但不提交事务,;
commit:先调用flush()方法,然后提交事务.则意味着提交事务意味着对数据库操作永久保存下来。
reresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态.
clear:清空缓存,等价于list.removeAll();
知识点5:在hibernate中java对象的状态
Hibernate 把对象分为
4 种状态: 持久化状态, 临时状态,
游离状态, 删除状态.
Session 的特定方法能使对象从一个状态转换到另一个状态
知识点15: 操纵持久化对象-get() load()
从数据库中加载一个持久化对象
OID 对应的记录时, load()方法抛出
ObjectNotFoundException异常,
而get() 方法返回
null
示例代码:
javabean 及 配置文件参考上篇blog的 Customer.java Order.java Customer.hbm.xml hibernate.cfg.xml Order.hbm.xml
知识点示例代码:
AppFlushClearRefreshCommit.java
package cn.itcast.state; import java.util.Iterator;
import java.util.Set; import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class AppFlushClearRefreshCommit {
private static SessionFactory sf=null; static{
Configuration config=new Configuration();
config.configure("cn/itcast/state/hibernate.cfg.xml");
config.addClass(Customer.class);
config.addClass(Order.class);
sf=config.buildSessionFactory();
} /*
* 知识点4_1:清理session的缓存 测试flush方法的使用
*/
@Test
public void testFlush(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Customer c=new Customer();
c.setName("曹操"); session.save(c); /*
* 清理缓存,刷新session的一级缓存中数据到数据库中,让缓存中的数据跟数据库同步 方向缓存--->数据库
* 缓存中的数据不丢失
*/ session.flush(); //会产生insert语句,此时已经在数据库中,但数据库还没有确认 tx.commit(); //数据库确认插入的数据
session.close();
} /*
* 知识点4_2:清理session的缓存 测试flush和clear方法的使用
*/
@Test
public void testFlushClear(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //从数据库查询出的客户放置到session的一级缓存中
Customer c4=(Customer)session.get(Customer.class, 4); //select //清理缓存,缓存中的数据不丢失
session.flush();
//从session的一级缓存中获取要查询的数据
Customer c5=(Customer)session.get(Customer.class, 4); //不会产生select语句 //清空缓存,session的一级缓存中的数据丢失
session.clear(); //缓存中已经没有数据了,需要重新查询数据库
Customer c6=(Customer)session.get(Customer.class, 4); //会产生select语句 tx.commit(); //数据库确认插入的数据
session.close();
} /*
* 知识点4_4:清理session缓存 测试refresh方法的使用
*/
@Test
public void tesRefresh(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Customer c4=(Customer)session.get(Customer.class, 4); //select
c4.setName("马超"); //刷新数据库中的数据和缓存中的同步,方法向从数据库----> 缓存,产生select语句
session.refresh(c4); tx.commit(); //数据库确认插入的数据
session.close();
} /*
* 知识点4_5:清理session的缓存(设置缓存的清理模式)
*/
@Test
public void testCacheMode11(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //设置缓存的模式是自动模式
Customer c=new Customer();
c.setName("秦琼"); session.save(c); tx.commit(); //产生insert语句 session.close();
} /*
* 知识点4_5:清理session的缓存(设置缓存的清理模式)
*/
@Test
public void testCacheMode12(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //设置缓存的模式是自动模式
Customer c=new Customer();
c.setName("秦琼");
session.save(c); session.flush();//产生insert语句
tx.commit(); session.close();
} /*
* 知识点4_5:清理session的缓存(设置缓存的清理模式)
*/
@Test
public void testCacheMode13(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //设置缓存的模式是从不清理缓存
session.setFlushMode(FlushMode.NEVER); Customer c=new Customer();
c.setName("秦琼");
session.save(c); //该方法不清理缓存,不会产生insert语句,此时数据不能插入到数据库中
tx.commit(); session.close();
} /*
* 知识点4_5:清理session的缓存(设置缓存的清理模式)
*/
@Test
public void testCacheMode14(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //设置缓存的模式是从不清理缓存
session.setFlushMode(FlushMode.NEVER); Customer c=new Customer();
c.setName("秦琼");
session.save(c); //该方法清理缓存
session.flush(); //产生insert语句 //该方法不清理缓存
tx.commit(); session.close();
} /*
* 知识点4_5:清理session的缓存(设置缓存的清理模式)
*/
@Test
public void testBatchData(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //设置缓存的模式是从不清理缓存
session.setFlushMode(FlushMode.NEVER); for(int i=0;i<100000;i++){
Customer c=new Customer();
c.setName("朱仝"+i);
session.save(c);
if(i%1000==0){
//清理缓存,数据已经存在数据库,就是没有确认
session.flush();
//清空缓存
session.clear();
}
} //清理缓存
session.flush(); //该方法不清理缓存
tx.commit(); session.close();
} }
AppState.java
package cn.itcast.state; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class AppState {
private static SessionFactory sf = null; static {
Configuration config = new Configuration();
config.configure("cn/itcast/state/hibernate.cfg.xml");
config.addClass(Customer.class);
config.addClass(Order.class);
sf = config.buildSessionFactory();
} /*
* 知识点5:临时对象(transient) 对象的状态
*/
@Test
public void teststate() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //刚刚创建一个对象,此时就是临时对象,OID=null
Customer c = new Customer();
c.setName("曹操");
System.out.println("c.getId() "+c.getId()); //null //此时customer对象变为持久对象(持久对象有OID,OID不为空)处于session的缓存中
session.save(c);
System.out.println("c.getId() "+c.getId()); //存在值 tx.commit(); // 数据库确认插入的数据
session.close(); //此时没有一级缓存了 //session关闭后,此时c引用的对象转化为游离对象 不再处于 Session 的缓存中
System.out.println(c.getId()+" "+c.getName()); //此时对象不再被引用,被jvm回收
c=null; /****************************************************************************************************************/
session = sf.openSession();
tx = session.beginTransaction(); //c1在session的一级缓存中存在 是持久对象
Customer c1=(Customer)session.get(Customer.class, 5); //删除c1对象
session.delete(c1);
//此时c1变为删除对象 tx.commit(); // 数据库确认插入的数据
session.close(); //此时没有一级缓存了 //session关闭后,此时c1为游离对象 /****************************************************************************************************************/
} /*
* 知识点5:临时对象(transient) 对象的状态
* * evict()方法:该方法能将持久对象转化为游离对象
*/
@Test
public void testEvict() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //c1在session的一级缓存中存在 是持久对象
Customer c1=(Customer)session.get(Customer.class, 5); //产生select语句 //直接从session的一级缓存中查询数据
Customer c2=(Customer)session.get(Customer.class, 5); //不产生select语句 //将session一级缓存中的对象转化为游离对象,此时该对象在session的一级缓存中不存在
session.evict(c1); //该方法能将游离对象再转化为持久对象,此时该对象有存在session的一级缓存中
session.update(c1); //在缓存中不存在该对象,所以要查询数据库
Customer c3=(Customer)session.get(Customer.class, 5); //不产生select语句 tx.commit(); // 数据库确认插入的数据
session.close(); //此时没有一级缓存了
}
}
AppMethod.java
package cn.itcast.state; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class AppMethod { private static SessionFactory sf = null; static {
Configuration config = new Configuration();
config.configure("cn/itcast/state/hibernate.cfg.xml");
config.addClass(Customer.class);
config.addClass(Order.class);
sf = config.buildSessionFactory();
} /*
* 知识点12: 操纵持久化对象-save()
*/
@Test
public void testSave() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); Customer c=new Customer();
c.setId(3); //没有用途
c.setName("西门庆");
session.save(c); tx.commit();
session.close();
} /*
* 知识点13_1: 操纵持久化对象-update()
*/
@Test
public void updagePersission() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //持久对象
Customer c=(Customer)session.get(Customer.class, 7); //游离对象
session.evict(c); //游离对象---->持久对象 ---执行update语句
session.update(c); tx.commit();
session.close();
} /*
* 知识点13_2: 操纵持久化对象-update()
* * 在customer.hbm.xml文件的class标签中增加 select-before-update="true"(在执行更新之前查询)
* * 目的:把要更新的信息又防止到session的一级缓存中,快照有一份
* * 在更新时,哪缓存中的数据和快照比对,没有变化,不再产生update语句
*/ @Test
public void updagePersissionClass() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //持久对象
Customer c=(Customer)session.get(Customer.class, 7); //游离对象
session.evict(c); //游离对象---->持久对象 ---执行update语句
session.update(c); tx.commit();
session.close();
} /*
* 知识点13_3: 操纵持久化对象-update()
*/
@Test
public void updagePersissionOId() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //查询数据库 c1持久对象
Customer c1=(Customer)session.get(Customer.class, 7); //c1游离对象
session.evict(c1); //查询数据库 c2持久对象
Customer c2=(Customer)session.get(Customer.class, 7); //c1持久对象
session.update(c1); tx.commit();
session.close();
} /*
* 知识点13_4: 操纵持久化对象-update()
*/
@Test
public void updagePersissionWithNoData() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //查询数据库 c1持久对象
Customer c1=(Customer)session.get(Customer.class, 7); //c1游离对象
session.evict(c1); System.out.println("cccccccccccccccc");
//手动删除数据 //c1持久对象
session.update(c1); tx.commit();
session.close();
} /*
* 知识点14_2: 操纵持久化对象-saveOrupdate()
*/
@Test
public void SaveOrUpdateTransient() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //临时对象
Customer c=new Customer();
c.setName("西门庆"); session.saveOrUpdate(c); tx.commit();
session.close();
} /*
* 知识点14_3: 操纵持久化对象-saveOrupdate()
* 如果是游离对象就用update方法
*/
@Test
public void updagePersissionDetached() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //查询数据库 c1持久对象
Customer c1=(Customer)session.get(Customer.class, 6); //c1游离对象
session.evict(c1); //c1持久对象 执行update方法
session.saveOrUpdate(c1); tx.commit();
session.close();
} /*
* 知识点14_4: 操纵持久化对象-saveOrupdate()
*/
@Test
public void updagePersissionPersiss() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //查询数据库 c1持久对象
Customer c1=(Customer)session.get(Customer.class, 6); //c1持久对象 不会产生update语句
session.saveOrUpdate(c1); tx.commit();
session.close();
} /*
* 知识点14_5: 操纵持久化对象-saveOrupdate()
* saveOrUpdate(c)中判定对象为临时对象的标准
* * 如果Id为Integer类型(private Integer id)
* * 如果Id==null执行save操作
* * 如果Id!=null执行update操作
* * 如果javaBean中id为int类型(private int id;)此时id的默认值为0
* 在Customer.hbm.xml文件 配置<id name="id" type="integer" unsaved-value="0">增加unsaved-value="0"
* * 如果javaBean中id属性的值与unsaved-value="0"相同,执行insert操作
* * 如果javaBean中id属性的值与unsaved-value="0"不相同,执行update操作 */
@Test
public void SaveOrUpdateUnsaved() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); //临时对象
Customer c=new Customer(); c.setName("西门庆"); session.saveOrUpdate(c);
System.out.println("c.getId() "+c.getId()); tx.commit();
session.close();
} /*
* 知识点15: 操纵持久化对象-get() load()
* * 区别
* * 相同点:都是通过id查询对象
* * 不同点;
* * 如果id在数据库中不存在get返回null,load抛出异常
* * get方法总是立即加载,load可以配置延迟和立即两种(后面讲)
*
*/
@Test
public void getOrLoad() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction(); Customer c1=(Customer)session.load(Customer.class, 14);
System.out.println("c1 = "+c1); tx.commit();
session.close();
}
}
Hibernate -- 操作持久化对象的更多相关文章
- hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)
三态的基本概念: 1, 暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...
- hibernate中持久化对象的生命周期(转载)
三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...
- hibernate中持久化对象的状态
持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...
- Hibernate的持久化对象
Hibernate的持久化类 什么是持久化类 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类. * ...
- hibernate载入持久化对象的两种方式——get、load
一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...
- 【Hibernate】持久化对象状态及以及缓存
一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...
- Hibernate之持久化对象
时间:2017-1-19 23:00 --Hibernate持久化类的状态1.持久化类:就是一个实体类与数据库建立了映射.2.Hibernate为了方便管理持久化类,将持久化类分为了三种状态: ...
- Hibernate的持久化对象配置
定义Pojo对象和**.hbm.xml文件 -1 对于每一个需要持久化的对象都需要创建一个Pojo类定义,Hibernate要求POJO类定义中必须有一个no-argument的构造方法,便于Hibe ...
- Hibernate(二)持久化对象的状态
简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射, ...
随机推荐
- 微信小程序直播
微信小程序直播(转) 通过PC实现推流,然后用小程序进行直播播放,也就是PC->小程序. 小程序支持 小程序的直播能力只针对某些类目开放并且需要申请开通. 支持的类目 社交 直播 教育 在线教育 ...
- [Algorithms] Longest Common Subsequence
The Longest Common Subsequence (LCS) problem is as follows: Given two sequences s and t, find the le ...
- string 转 java对象、转map的方式
1.使用fastJson 将String转 map: String out; Object succesResponse = JSON.parse(out); //先转换成Object Map ...
- 诡异的js
[] + {}; 隐式转换后,是0 那 {} + []呢? var a = 42,b; b = ( a++, a);
- java反射——字段
大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...
- delphi -----TTreeView
TTreeView 与两个重要的类相关:TTreeNodes.TTreeNode . TTreeNodes即是TTreeView 的Items属性,TTreeNodes是TTreeNode的合集,TT ...
- The 12 Months of the Year
- 常用的SQLalchemy 字段类型
https://blog.csdn.net/weixin_41896508/article/details/80772238 常用的SQLAlchemy字段类型 类型名 python中类型 说明 In ...
- django博客项目2.建立 Django 博客应用
建立博客应用 我们已经建立了 Django 博客的项目工程,并且成功地运行了它.不过到目前为止这一切都还只是 Django 为我们创建的项目初始内容,Django 不可能为我们初始化生成博客代码,这些 ...
- url监控
#!/usr/bin/env python #coding:utf-8 import MySQLdb,requests import time from datetime import datetim ...