一、Hibernate的工作原理:

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory 

二、Hibernate的三种状态转换

1、临时状态:

刚刚new出一个实体对象的时候,该对象未和任一条数据库记录想关联(也就是对象未和任何一个session相关联,对象没有主键这一持久化标识),此时的状态时临

时状态。

  1. 临时状态的特点:
    1. 未和任何session相关联。
    2. 未和任一条数据库记录相关联。

2、持久化状态:指实体对象处于由Hibernate框架所管理的状态,实体对象被纳入Hibernate实体容器中加以管理。

  1. 持久化状态的特点
    1. 持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后才在数据库中真正运行SQL进行变更,持久对象的数据才会与数据库进行同步。同步之前的持久对象称为脏(dirty)对象
    2. 数据库里面有某一条记录与持久化对象相对应。

3、游离状态:与持久对象关联的session被关闭后,对象就变成游离状态。

  1. 游离状态的特点
    1. 不被任何session关联;如果没有变量引用此对象的情况下,GC回收此对象。这个和临时状态是一样的。
    2. 比临时状态多了一个与数据库标识的OID。

三、

1Hibernate有哪几种查询数据的方式

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;

最新文章

  1. rigidbody2D.velocity 提示缺少using?用的unity5?
  2. oracle修改字段长度
  3. 例子:Background Agent Sample
  4. js-事件、正则表达式
  5. Html、Css-----当有文字和图片的时候,需要文字和图片居中,怎么实现?不想文字换行怎么设置
  6. RDLC报表分页显示标题
  7. C++:构造函数和析构函数能否为虚函数
  8. 在Eclipse中怎样公布创建的JavaWebproject
  9. 大数据笔记13:Hadoop安装之Hadoop的配置安装
  10. struts2.x中因变量命名错误不被注入到值栈的问题
  11. Spring发送电子邮件
  12. javascript 函数的多义性
  13. jQuery根据radio来控制texteara
  14. 控制使用jquery load()方法载入新页面中的元素
  15. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 即时消息提醒功能改进
  16. CentOS7查询最近修改的文件
  17. python中if else流程判断
  18. pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。
  19. 如何在Pycharm中配置Python和Django(环境搭建篇)
  20. redis之hello

热门文章

  1. 笔记整理--Http-Cookie
  2. hdu_5213_Lucky(莫队算法+容斥定理)
  3. HTNL5新增标签
  4. usb调试
  5. Polygone对象
  6. gen_create_syn.sql
  7. keyCode码集合
  8. 百度网盘API的操作--PCS 百度个人云存储 上传 ,下载文件
  9. ntpdate
  10. SQL复习五(索引)