Hibernate学习_005_Hibernate 中关于SessionFactory、Session接口的理解

来源:互联网 发布:阿里云 流量收费标准 编辑:程序博客网 时间:2024/06/03 01:19

SessionFactory,Session作为Hibernate中的两个核心接口,Hibernate中几乎所有涉及到数据库的操作都必须通过这两个接口来实现。

简言之,SessionFactory 就是Session的工场,我们可以将SessionFactory看做是一个具体数据库在内存的映射,也可以将SessionFactory看作是一个具体数据库对应的连接池。而我们每次通过Session来操作数据,可以将Sesson看做一个从这个连接池取得的连接,当然,这个Session中不仅仅包含有一个Connection对象,还有很多其他对象。

关于理解SessionFactory和Session的难点在于,通过SessionFactory获取Session时所采用的方式的区别,一般通过SessionFactory有两个方法可以获取Session,getCurrnetSession()以及openSession()。这两个方法有以下几点明显的区别。

  1. openSession()方法每次都是获取的一个新的Session,并且使用完毕之后,这个session必须手动Close。而采用getCurrentSession()的时候,则每次都是从当前的上下文中获取Sesison,如果当前上下文中存在Session,就用当前的Session,否则就创建一个新的Session,并且这个Session是不需要手动的Close,而是会随着的事物的提交来关闭。
  2. 当我们通过OpenSession开启一个Session后,紧接着我们通过getCurrentSession()并不可以获取到那个使用openSession()方法打开的Session,这也许是这两个方法的实现类并不相同的原因。 而且在一个方法中,一般这两个方法不可以同时使用的。
  3. getCurrentSession(),一般用来确定事物的边界的时候,很有用,而使用openSession()方法每次取得的都是一个新的Session,也就是一个新的Connection,则没有办法实现维护事物的完整性。因为在同一个事务中,事务没有提交之前,getCurrentSession 取得的是同一个session,也就是还是在一个数据库连接中;提交之后,再次取得session是不同的session。自动提交。

在我们用getCurrentSession()获取Session的时候,是从上下文来获取Session的,当我们要指定这个获取Session的上下文时,只需要在Hibebrnate.cfg.xml中配置一个常量即可。如下代码所示:

<property name="current_session_context_class">thread</property> 
当current_session_context_class取值为Thread的时候,使用当前线程这个上下文来获取Session.也就是使用数据库本身的Connection来管理事物(将autoCommit设为false,如果流程一切正常,则commit,出现异常则rollback)

那么current_session_context_class取jta的时候是一个什么样的情况呢?现在我们设想这样一个情况,如果一个下单买东西的业务流程是这样的:首先这个流程要到数据库A(假设为MySql)去插入一条订单记录,随后还要在数据库B(假设为Oracle)中插入一条财务信息,此时很明显,针对每个数据都必须要有一个Connection对象来处理数据插入,那么此时如何保证事物完整性?这就是一种分布式的事物,此时就必须要通过JTA来解决。当使用jta来处理事物的时候,此时也要使用专门的驱动器类,这种数据库驱动叫做XADriver。而且还需要一个叫做事务管理器的中间件,这个中间件一般都是由ApplicationServer来提供,比如JBoss,WebLogic,但是我们常常使用的Tomcat并不提供JTA的支持,但当有Spring的支持后,Tomcat也是可以支持JTA事物的。

那么现在有一个问题,这些个中间件是如何保证事物的完整性的?上午Google了一把,一个解释是这样的:这个事物管理器中间件会记录每个Connection对具体数据库的操作,当所有操作完成后,一起提交,当这些个Connection中有一个失败,则以前Connection对数据库的操作全部rollback。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机存的照片误删了怎么办 魔兽世界把要用的装备分解了怎么办 邻居家的狗见到我就叫怎么办 我的世界玩的时间长会卡应该怎么办 网易我的世界密码账号都忘了怎么办 我的世界创建世界画面乱码了怎么办 网易我的世界云端存档不够用怎么办 玩刺激战场带耳机声音有延迟怎么办 我的世界手机版狼变色怎么办 我的世界开了光影太阳太刺眼怎么办 我的世界饥饿值掉的慢怎么办 我的世界合装备过于昂贵怎么办 我的世界故事模式屏幕是黑的怎么办 人物只剩下轮廓的图用ps怎么办 两年义务兵考军校分数不够怎么办 大学生兵考上军校后原学籍怎么办 我的世界工业附魔到精准采集怎么办 交换生在台期间遗失通行证怎么办 驾驶证上的号码是士兵证号怎么办 士兵证丢了但是要买飞机票怎么办 君泰保安公司不发工资怎么办 冬天洗棉衣后有一圈白色怎么办 买了一批化肥没有执行标准怎么办 防护栏下面打不了膨胀螺丝怎么办 不知道怀孕照了x射线怎么办 腹部照了x光片照了三次怎么办 像在工厂戴的静电帽弄丢了怎么办 诈骗犯把钱被转到别人账户怎么办 狗狗5个月在家随地大小便怎么办 上课放屁放的快没憋到老是放怎么办 丈夫有外遇并跟小三有一儿子怎么办 借款夫妻双亡借出去的钱怎么办? 橡胶底的劳保鞋开胶了怎么办? 求部队停止有偿服务内部超市怎么办 晋江买了全本还是有防盗章节怎么办 宝宝没有穿衣服的地方长疙瘩怎么办 詹姆斯士兵12魔术贴老是掉怎么办 手机版本不支持陌陌视频聊天怎么办 私人单位不给员工写收入证明怎么办 cad图形缩小后找不到图了怎么办 离婚了老婆嫁给了别人怎么办