Hibernate的一些事儿
一、Hibernate的工作原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
二、Hibernate的三种状态转换
1、临时状态:
刚刚new出一个实体对象的时候,该对象未和任一条数据库记录想关联(也就是对象未和任何一个session相关联,对象没有主键这一持久化标识),此时的状态时临
时状态。
- 临时状态的特点:
- 未和任何session相关联。
- 未和任一条数据库记录相关联。
2、持久化状态:指实体对象处于由Hibernate框架所管理的状态,实体对象被纳入Hibernate实体容器中加以管理。
- 持久化状态的特点
- 持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后才在数据库中真正运行SQL进行变更,持久对象的数据才会与数据库进行同步。同步之前的持久对象称为脏(dirty)对象
- 数据库里面有某一条记录与持久化对象相对应。
3、游离状态:与持久对象关联的session被关闭后,对象就变成游离状态。
- 游离状态的特点
- 不被任何session关联;如果没有变量引用此对象的情况下,GC回收此对象。这个和临时状态是一样的。
- 比临时状态多了一个与数据库标识的OID。
三、
1、Hibernate有哪几种查询数据的方式
3种:hql、QBC——Query By Criteria API、原生sql (通过createSQLQuery建立)
2、 谈谈Hibernate中inverse的作用
inverse属性默认是false,就是说关系的两端都来维护关系。
比如Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。
如果Student这边inverse=”true”, 那么关系由另一端Teacher维护,就是说当插入Student时,不会操作TeacherStudent表(中间表)。只有Teacher插入或删除时才会触发对中间表的操作。
所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;
当两边都inverse=”false”
或默认时,会导致在中间表中插入两次关系。
3、 说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。
saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
如果对象在该session中已经被持久化,不进行操作;对象的标识符属性(identifier
property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;如果session中的另一个对象有相同的标识符抛出一个异常;以上皆不符合则调用update()更新之。
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;
load方法可返回实体的代理类实例,而get方法永远直接返回实体类;
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,
将越过二级缓存,直接调用SQL完成数据读取。
4、Hibernate的并发机制
a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。
如果一个Session
实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。
如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”,
就会导致两个并发运行的线程使用同一个Session。
b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。
解决方案:设置事务隔离级别。
Serializable:串行化。隔离级别最高
Repeatable Read:可重复读
Read Committed:已提交数据读
Read Uncommitted:未提交数据读。隔离级别最差
设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
最新文章
- rigidbody2D.velocity 提示缺少using?用的unity5?
- oracle修改字段长度
- 例子:Background Agent Sample
- js-事件、正则表达式
- Html、Css-----当有文字和图片的时候,需要文字和图片居中,怎么实现?不想文字换行怎么设置
- RDLC报表分页显示标题
- C++:构造函数和析构函数能否为虚函数
- 在Eclipse中怎样公布创建的JavaWebproject
- 大数据笔记13:Hadoop安装之Hadoop的配置安装
- struts2.x中因变量命名错误不被注入到值栈的问题
- Spring发送电子邮件
- javascript 函数的多义性
- jQuery根据radio来控制texteara
- 控制使用jquery load()方法载入新页面中的元素
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 即时消息提醒功能改进
- CentOS7查询最近修改的文件
- python中if else流程判断
- pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。
- 如何在Pycharm中配置Python和Django(环境搭建篇)
- redis之hello