Hibernate问题浅析

1、什么是SessionFactory?什么是Session?httpsession和hibernate的session的有什么区别?

    SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。----百度百科

   在hibernate中的session并不是http中所说的session,一般把HttpSession对象称为用户会话。。。

而hibernate中的Session呢?是用来表示,应用程序和数据库的一次交互(会话)。在这个Session中,包含了一般的持久化方法(CRUD)。而且,Session是一个轻量级对象(线程不安全),通常将每个Session实例和一个数据库事务绑定,也就是每执行一个数据库事务,都应该先创建一个新的Session实例,在使用Session后,还需要关闭Session

2、n+1问题?

一般而言说n+1意思是,无论在一对多还是多对一当查询出n条数据之后,每条数据会关联的查询1次他的关联对象,这就叫做n+1。

下面是3中解决方案:


    1. 设置@ManyToOne的fetch属性值为fetchType.LAZY,这种方式解决后,后面的n条sql语句按需而发。但是有个弊端,就是如果需要级联查询就无法获取级联对象了。

    2. 设置@BatchSize(size=5)(该注解要加在类上面,跟@Entity在同一位置),这样发出的sql语句减少。这个设置在一定程度上提高了效率。

    3.  join fetch , 如 使用"from Student s left join fetch s.group g", 进行表连接查询,此时就发1条SQL语句。

    4.  使用QBC查询,默认效果与3相同。

              1)fetch="select" 会另外发出一条语句查询集合

              2) 设置 fetch="join" 采用外连接集合的 lazy 失效

              3) 这只 fetch="subselect" 另外发出一条 select 语句抓取前面查询到的所有的实体对象的关联集合 fetch只对 HQL 查询产生影响其他的则不会

 

3、Hibernate中的get和load加载有什么区别?

当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们 使不使用这个对象,此时都会发出sql语句去从数据库中查询出来。

 

4、脏读和幻读?

脏读:是指当一个事务正在访问数据,且对数据做了修改,但是还没有提交到数据库。另一个事务查询到这个数据、这个数据就是脏数据,依靠这个数据所做的操作就是不正确的、

幻读:比如第一个事务对数据库的全部行进行了修改,同时第二个事务插入一条数据到数据库中,这时第一个事务就会发现,数据库中有一条记录没有被修改,像发生了幻觉一样、






      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1932736,如需转载请自行联系原作者





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值