Hibernate_操作对象_Session中的方法详解
2017-05-07 21:07
316 查看
对象的状态:
临时状态:
与数据库没有对应,跟Session没有关联。
一般是新new出的对象。
持久化状态:
对象在Session的管理之中,最终会有对应的数据库记录
特点:
1,有OID
2,对对象修改会同步到数据库
游离状态:
数据库中有对应记录,但对象不在Session管理之中。
修改此状态时,数据库不会有改变。
删除状态:
执行了delete()后的对象
=====================================================
一、操作实体对象的
saver()
saverOrUpdate()
update()
delete()
二、操作缓存的
clear()
evict()
flush()
三、查询实体对象的
get()
load()
createQuery()
createCriteria()
加载方式 返回值 如果数据不存在
-----------------------------------------------------------------------
get() 立即加载 真实对象或者为null 返回null (饿汉模式)
load() 延迟加载 返回代理对象 抛异常 (懒汉模式)
测试JVM内存溢出
临时状态:
与数据库没有对应,跟Session没有关联。
一般是新new出的对象。
持久化状态:
对象在Session的管理之中,最终会有对应的数据库记录
特点:
1,有OID
2,对对象修改会同步到数据库
游离状态:
数据库中有对应记录,但对象不在Session管理之中。
修改此状态时,数据库不会有改变。
删除状态:
执行了delete()后的对象
=====================================================
一、操作实体对象的
saver()
saverOrUpdate()
update()
delete()
二、操作缓存的
clear()
evict()
flush()
三、查询实体对象的
get()
load()
createQuery()
createCriteria()
加载方式 返回值 如果数据不存在
-----------------------------------------------------------------------
get() 立即加载 真实对象或者为null 返回null (饿汉模式)
load() 延迟加载 返回代理对象 抛异常 (懒汉模式)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 导入包 --> <hibernate-mapping package="cn.itcast.h_session_method"> <!-- lazy属性:默认为true,默认可以懒加载。 --> <class name="User" table="user" lazy="true"> <id name="id" type="integer" column="id"> <generator class="native" /> </id> <property name="name" type="string" column="name" /> </class> </hibernate-mapping>
package cn.itcast.h_session_method; /** * 实体 * * @author 风清杨 * @version V1.0 */ public class User { private Integer id;// 编号 private String name;// 姓名 private byte[] bys = new byte[1024 * 1024 * 10]; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
package cn.itcast.h_session_method; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; /** * 操作类 * * @author 风清杨 * @version V1.0 */ public class App { private static SessionFactory sessionFactory;// 创建会话工厂 // 初始化配置 static { // 会话工厂生成 sessionFactory = new Configuration()// .configure()// .addClass(User.class)// 添加hibernate实体类(加载对应的映射文件) .buildSessionFactory(); } // save():把临时状态变成持久化状态(交给session管理) // 会生成:insert into ... @Test public void testSave() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; User user = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ user = new User();// 临时状态 user.setName("test"); session.save(user);// 变为了持久化状态 // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } user.setName("李四");// 游离状态 System.out.println(user.getName());// 游离状态 } // update():把游离状态变为持久化状态 // 会生成:update ... // 在更新时,对象不存在就报错 @Test public void testUpdate() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.get(User.class, 1); System.out.println(user.getName());// 持久化状态 // session.clear();// 清除Session中所有的对象 游离状态 session.evict(user);// 清除Session中一个指定的对象 user.setName("newname"); session.update(user);// 持久化状态 // session.flush();// 刷出到数据库 // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // saverOrupdate():把临时或游离状态转为持久化状态 // 会生成:insert into 或者是 update // 在更新时,对象不存在就报错 // 本方法是根据id判断对象是什么状态,如果id为原始值(对象是null,原始类型数字是0)就是临时状态,如果不是原始值就是游离状态。 @Test public void testSaveOrupdate() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = new User(); user.setId(3);// 自已生成一个游离状态对象 user.setName("newname3"); session.saveOrUpdate(user); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // delete():把持久化状态转为删除状态 // 会生成:delete ... // 如果删除的对象不存在,就会抛异常 @Test public void testDelete() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ // User user = (User) session.get(User.class, 2);// 持久化 User user = new User();// 游离状态 user.setId(130); session.delete(user); session.flush(); System.out.println("---"); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // get():获取数据,是持久化状态 // 会生成:select ... where id=? // 会马上执行SQL语句 // 如果数据不存在,就会返回null @Test public void testGet() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.get(User.class, 2);// 持久化状态 System.out.println(user); System.out.println("-----"); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // load():获取数据,是持久化状态 // 会生成:select ... where id=? // load()后返回的是一个代理对象,要求类不能是final的,否则不能生成子类代理,就不能使用懒加载功能了 // 让懒加载失效方式:一、把实体类写成final的;二、在hbm.xml中写<class ... lazy="false">; // 不会会马上执行SQL语句,而是在第一次使用非id或class属性时执行SQL。 // 如果数据不存在,就抛出异常 @Test public void testLoad() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.load(User.class, 5);// 持久化状态 System.out.println(user.getClass()); System.out.println("-----"); System.out.println(user.getName()); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // 操作大量数据,要防止Session对象过多而内存溢出 @Test public void testBatchSave() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ for (int x = 0; x < 160; x++) { User user = new User(); user.setName("测试"); session.save(user); if (x % 10 == 0) { session.flush();// 先刷出 session.clear();// 再清空 } } // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } }
测试JVM内存溢出
相关文章推荐
- Hibernate_操作对象_Session中的refresh()方法与修改事务隔离级别详解
- Hibernate_操作对象_对象的状态分类、Session中的方法概述
- Hibernate详解(一)--session操作对象
- Hibernate学习笔记:session操作对象
- Hibernate入门BLOG [三、session的常用方法和hibernate对象的3种状态]
- Hibernate之Session缓存以及操作Session缓存的相关方法
- 详解Python中的__getitem__方法与slice对象的切片操作
- Hibernate持久化对象状态 Session缓存(一级缓存),快照 操纵持久化对象的方法
- Hibernate之Session对象的相关方法以及持久化对象的状态
- 对象的三种状态(hibernate的session的get和load方法的区别,session的常用方法,session缓存)
- Hibernate之Session缓存以及操作Session缓存的相关方法
- Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征
- 详解Python中的__getitem__方法与slice对象的切片操作
- Hibernate: Session对象中的两个保存记录的方法 save vs. persist
- Hibernate持久化对象状态、转换方法和操作步骤
- hibernate中PO对象的三种状态分析以及session中的一些方法的区别
- Hibernate入门BLOG [二、封装拿到数据库配置session对象、并且执行操作]
- hibernate 持久化对象 session中的方法
- Spring3与hibernate4整合,sessionFactory.getCurrentSession()方法获取不到Session对象异常解决办法
- Hibernate框架详解(二)POJO对象的操作