现在我们可以在 IDEA 下新建一个 Hibernate 项目,接着上次内容这次主要总结一下 Hibernate 的 Session,及其核心方法。


Session

概述

  • Session 接口是 Hibernate 向应用程序提供的操纵数据库的主要接口,提供了基本的保存、更新、删除和加载 java 对象的方法
  • Session 具有一个缓存,位于缓存中的对象称为持久化对象,和数据库中的相关记录对应
  • Hibernate 将对象分为 4 种状态,持久化状态,临时状态,游离状态,删除状态,Session 特定的方法可以使对象从一个状态到另一个状态。

Session 缓存

  • Session 接口实现中包含一系列 java 集合,这些 java 集合构成了 Session 缓存,只要 Session 实例没有结束生命周期,且没有清理缓存,则存放在他缓存中的对象也不会结束生命周期
  • Session 缓存可以减少 Hibernate 访问数据库的频率

操作 Session 缓存

  • reflush(): 会强制发送sql查询(select)语句,使缓存中的数据和数据库中的数据保持一致,数据由数据库到缓存
  • flush(): 会强制发送sql更新(update)语句,使数据库中的数据和缓存中的数据保持一致,数据由缓存到数据库
  • 当程序执行 Transaction 的 commit() 方法时,该方法会先 flush(),然后再提交事务

持久化对象的状态

  • 临时对象

    • ID 通常为 null
    • 不处于 Session 的缓存中
    • 在数据库中没有对应的记录
  • 持久化对象
    • ID 不为 null
    • 位于 Session 缓存中
    • 持久化对象和数据库中相关记录对应
    • Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库
    • 同一个 Session 实例的缓存中,数据库表的每条记录对应唯一的持久化对象
  • 删除对象
    • 数据库中没有其 ID 对应的记录
    • 不再处于 Session 缓存中
    • 一般情况下应用程序不再使用该对象
  • 游离对象
    • ID 不为 null
    • 不再处于 Session 缓存中
    • 游离对象一般由持久化对象转换而来,因为数据库中可能会存在对应的对象

Session 方法

  • save() & persist()

    • save() 和 persist() 方法可以使得一个临时对象转变为持久化对象
    • 执行 save() 和 persist() 方法将会在 flush 缓存的时候执行一条 insert 语句
  • get() & load()
    • 都是从根据 id 从数据库中加载一个持久化对象,当数据库中没有对应 id 的对象,get() 方法返回 null,load() 方法抛出一个异常
    • load() 有延迟加载策略,即执行方法后返回一个代理对象,直到用到该对象的时候才会持久化,若关闭了 session,那么就会发生懒加载异常
  • update()
    • update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条update 语句.
    • 当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常
  • delete()
    • delete() 方法既可以删除一个游离对象,也可以删除一个持久化对象

Hibernate Session总结的更多相关文章

  1. org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not a ...

  2. Use Spring transaction to simplify Hibernate session management

    Spring对Hibernate有很好的支持    DataSource ->SessionFactory-> HibernateTranscationManagerHibernate中通 ...

  3. Could not open Hibernate Session for transaction;

    javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...

  4. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  5. [转]Hibernate Session各种状态转换方法分析

    摘自http://spiritfrog.iteye.com/blog/221177 我的印象里, Hibernate session中常用的保存操作只有:save, update, saveOrUpd ...

  6. spring事务管理出错。No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy ...

  7. [原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载

    问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagati ...

  8. No Hibernate Session bound to thread, and configuration does not allow creat

    No Hibernate Session bound to thread, and configuration does not allow creat 今天遇到这么一个错误,在网上差了很多都没有能解 ...

  9. Hibernate Session 获取connection

    Hibernate Session 获取connection 由于最近一个项目要用到一条辅助的SQL ,hibernate里面的SQLQuery API 总的SQL语句不能包含 : 冒号, 固放弃Hi ...

  10. hibernate.Session简介

    ★→→SessionFactory (org.hibernate.SessionFactory) 包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(tra ...

随机推荐

  1. javascript语法之字符串转换成数字

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Css中的盒子结构padding和margin的区别

    之前写过一个padding和marfgin的区别的博客见地址:http://blog.csdn.net/qq_32059827/article/details/50998965.那里只是笼统介绍了一下 ...

  3. Android进阶(十六)子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误

    原子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误 今天用子线程调Toast报 ...

  4. Andriod 安全之Windows下CTS自动化测试环境的搭建

    原文出处:http://blog.csdn.net/sk719887916/article/details/48050997 安卓应用离不开性能测试,也离不开安全测试,CTS是常用的安全测试工具,开发 ...

  5. Python学习笔记 - map reduce

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- def f(x): return x * x r = map(f, [1, 2, 3, 4, 5, 6, ...

  6. Python学习笔记 - 列表生成式listComprehensions

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- list(range(1, 11)) # 生成1乘1,2乘2...10乘10 L = [] for x i ...

  7. 《java入门第一季》之面向对象(继承总结)

    继承已经全部写完了,接下来通过几个案例对继承问题做一个总结: /* 看程序写结果: A:成员变量 就近原则 B:this和super的问题 this访问本类的成员 super访问父类的成员 C:子类构 ...

  8. Oracle ADF 开发必读

    MARK:http://www.oracle.com/technetwork/cn/articles/adf/index-086064-zhs.html 第 1 部分- 借助 Subversion 进 ...

  9. Linux - script练习

    首先HelloWorld 对谈式脚本:变量内容由使用者决定 随日期变化:利用date进行文件的创建 比较直接运行与利用source来运行脚本的区别

  10. CUDA版本的OpenCL在windows 7的下编程初步

    参考文献: http://blog.csdn.net/neoxmu/article/details/8866928 我安装的是CUDA5.5,代码如下: //#include "stdafx ...