阅读Hibernate框架Session接口的源码的笔记
一、阅读Session接口的注释的理解。(看着注释翻译的,有些地方可能翻译的不太对,有疑问再看源文档)
①、Session的生命周期随着事务开始而开始,事务的结束而结束。
附原文:The lifecycle of a <tt>Session</tt> is bounded by the beginning and end of a logical transaction. (Long transactions might span several database transactions.)
②、Session的主要方法提供了对对象的增删改查操作,对象可能存在三种状态:临时状态(transient)、持久化状态(persistent)、游离状态(detached)
临时状态:没有持久化、没有和任何Session关联(附原文:never persistent, not associated with any <tt>Session</tt><br>)
持久化状态:与一个唯一的Session关联(associated with a unique <tt>Session</tt><br>)
游离状态:之前是与Session关联的,但是现在已经脱离Session的管理,没有与任何Session关联(previously persistent, not associated with any <tt>Session</tt><br>)
③、1.临时状态的对象可能会在调用save()、persist()、saveOrUpdate()这几个方法后被持久化。
2.持久化状态的对象可能在调用delete()方法后变成临时状态。
3.get()、load()方法返回的对象都是持久化状态。
4.游离状态的对象可能会在调用update()、saveOrUpdate()、lock()、replicate()这几个方法后被持久化
④、临时状态或游离状态的对象在调用merge()方法后可能会被固化为一个新的持久化对象。
⑤、save()、persist()方法会导致发送一个INSERT语句;delete()方法会导致发送一个DELETE语句;update()、merge()方法会导致发送一个UPDATE语句;
在清除缓存的时候发现一个持久化对象发生改变会发送一条UPDATE语句。调用saveOrUpdate()或replicate()将会导致发送一条INSERT语句或者UPDATE语句。
⑥、每个线程/事务都应该从SessionFactory中获得它自己的实例。
⑦、如果一个Session的持久化类是可序列化的那么这个Session也是可序列化的。
⑧、如果Session抛出异常,那么事务必须回滚,并且抛弃Session。当异常发生后,Session的内部状态可能与数据不一样。
------------------------------------------------分割线------------------------------------------------------
二、阅读一些方法
public void flush() throws HibernateException;
一)、
清除session缓存。
①、在完成一些工作后,在提交事务和关闭session之前,必须要调用flush()方法。
②、<i>Flushing</i> is the process of synchronizing the underlying persistent store with persistable state held in memory.(暂时不能将其翻译通顺)
二)、public SessionFactory getSessionFactory();
获取创建这个session的SessionFactory。
三)、public Connection close() throws HibernateException;
通过释放JDBC连接和清理来结束这个session
四)、public Serializable getIdentifier(Object object);
返回给定对象的ID(identifier),如果这个对象处于临时状态或者游离状态那么就会抛出异常。
五)、public boolean contains(Object object);
检查给定的对象是否与session关联。
六)、public void evict(Object object);
将对象从session缓存中移除。这个时候对象将不与数据库中的同步了。(后面的不懂翻译)This operation cascades to associated instances if the association is mapped with <tt>cascade="evict"</tt>.
七)、public Object load(Class theClass, Serializable id);
load()方法有好多个重载的方法。这里只列举一个
①、用给定的id和对象的类型加载一个类持久化对象。
②、不能使用这个方法来判断一个对象是否存在,可以使用get()方法代替
八)、public void replicate(Object object, ReplicationMode replicationMode);
重新使用当前id将游离状态下的对象持久化。
九)、public Serializable save(Object object);
将一个临时状态的对象持久化,设定id。如果在映射文件中将<id>标签中的<generator>标签的 class属性设为"assigned" 。那么id就使用当前临时状态对象的id值。
十)、public void saveOrUpdate(Object object);
不懂翻译通顺
Either {@link #save(Object)} or {@link #update(Object)} the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).<p/> This operation cascades to associated instances if the association is mapped with {@code cascade="save-update"}
十一)、public void update(Object object);
将一个游离状态的对象持久化,id设为游离状态对象的ID,但是如果有一个持久化对象的id和这个游离状态的id相同,那么就会抛出异常
十二)、public Object merge(Object object);
之后继续更新
阅读Hibernate框架Session接口的源码的笔记的更多相关文章
- Java集合框架之接口Collection源码分析
本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...
- 如何优雅的阅读 GitHub 上开源 js 框架和库的源码
如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...
- Spring框架之spring-web web源码完全解析
Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...
- MyBatis框架的使用及源码分析(十一) StatementHandler
我们回忆一下<MyBatis框架的使用及源码分析(十) CacheExecutor,SimpleExecutor,BatchExecutor ,ReuseExecutor> , 这4个Ex ...
- MyBatis框架的使用及源码分析(九) Executor
从<MyBatis框架的使用及源码分析(八) MapperMethod>文中我们知道执行Mapper的每一个接口方法,最后调用的是MapperMethod.execute方法.而当执行Ma ...
- Spring框架之spring-web http源码完全解析
Spring框架之spring-web http源码完全解析 Spring-web是Spring webMVC的基础,由http.remoting.web三部分组成. http:封装了http协议中的 ...
- 【集合框架】JDK1.8源码分析之HashMap(一) 转载
[集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
随机推荐
- js中有关类、对象的增强函数
javascript中继承的实现 基础实现 function Range(from,to){ this.from =from; this.to =to; } Range.prototype = { i ...
- Bash编程(1) 基础
1. 基本知识 (1) $HOME: 当前用户的家目录 (2) `pwd`或$PWD:当前目录 (3) 脚本命名避免使用test,通过type -a test,可以查看所有匹配test的命令 gas@ ...
- ElasticSearch深入搜索
一. 结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见 ...
- Spring学习(一) IoC
文章部分图片来自参考资料,本文介绍的是 Spring 的两个重要概念,是学习总结. 我们依旧提出几个问题,帮助我们在学习中带着问题解答. 问题 : 如何理解Ioc,它解决了什么难题(或者说是使用它 ...
- golang学习之闭包
匿名函数不能够独立存在,但可以被赋值于某个变量,即保存函数的地址到变量中:fplus := func(x, y int) int { return x + y },然后通过变量名对函数进行调用:fpl ...
- sqlserver - FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- Mysql8.0.11简介,新特性
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- c语言结构体可以直接赋值
结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //de ...
- browserslist 目标浏览器配置表
为什么需要: 根据提供的目标浏览器的环境来,智能添加css前缀,js的polyfill垫片,来兼容旧版本浏览器,而不是一股脑的添加.避免不必要的兼容代码,以提高代码的编译质量. 共享使用browser ...
- php动态链接扩展库
文章来源:http://keping.me/php-call-so/ PHP调用C/C++动态链接库 David June 19, 2013 C++, Linux, Study 摘要 有时候,单纯依靠 ...