首页 数据库 mysql教程 Eclipse开发Hibernate应用程序_MySQL

Eclipse开发Hibernate应用程序_MySQL

Jun 01, 2016 pm 02:11 PM
hibernate transaction 应用程序 开发

HibernateEclipse

  
  Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析:

  Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:

  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JDBCTransactionFactory

  如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:

  hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory

  将使用JTATransaction,不管你准备让Hibernate使用JDBCTransaction,还是JTATransaction,我的忠告就是什么都不配,将让它保持默认状态,如下:

  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JDBCTransactionFactory

  在下面的分析中我会给出原因。

  一、JDBC Transaction

  看看使用JDBC Transaction的时候我们的代码例子:

  Session session = sf.openSession();
  Transaction tx = session.beginTransactioin();
  ...
  session.flush();
  tx.commit();
  session.close();

  这是默认的情况,当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢?来看看源代码就清楚了:

  Hibernate2.0.3源代码中的类

  net.sf.hibernate.transaction.JDBCTransaction:

  public void begin() throws HibernateException {
  ...
  if (toggleAutoCommit) session.connection().setAutoCommit(false);
  ...
  }

  这是启动Transaction的方法,看到 connection().setAutoCommit(false) 了吗?是不是很熟悉?

  再来看

  public void commit() throws HibernateException {
  ...
  try {
  if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
  try {
  session.connection().commit();
  committed = true;
  }
  ...
  toggleAutoCommit();
  }

  这是提交方法,看到connection().commit() 了吗?下面就不用我多说了,这个类代码非常简单易懂,通过阅读使我们明白Hibernate的Transaction都在干了些什么?我现在把用Hibernate写的例子翻译成JDBC,大家就一目了然了:

  Connection conn = ...;   conn.setAutoCommit(false);   ...   conn.commit();   conn.setAutoCommit(true);
  conn.close();
  看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。

  二、JTATransaction

  如果你在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction,先看一个例子:

  javax.transaction.UserTransaction tx = new
  InitialContext().lookup("javax.transaction.UserTransaction");
  Session s1 = sf.openSession();
  ...
  s1.flush();
  s1.close();
  ...
  Session s2 = sf.openSession();
  ...
  s2.flush();
  s2.close();
  tx.commit();

  这是标准的使用JTA的代码片断,Transaction是跨Session的,它的生命周期比Session要长。如果你在EJB中使用Hibernate,那么是最简单不过的了,你什么Transaction代码统统都不要写了,直接在EJB的部署描述符上配置某某方法是否使用事务就可以了。

  现在我们来分析一下JTATransaction的源代码, net.sf.hibernate.transaction.JTATransaction:

  public void begin(InitialContext context, ...
  ...
  ut = (UserTransaction) context.lookup(utName);
  ...

  看清楚了吗? 和我上面写的代码 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一样?

  public void commit() ...
  ...
  if (newTransaction) ut.commit();
  ...

  JTATransaction的控制稍微复杂,不过仍然可以很清楚的看出来Hibernate是如何封装JTA的Transaction代码的。

  但是你现在是否看到了什么问题? 仔细想一下,Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。

  总结:

  1、在JDBC上使用Hibernate 必须写上Hibernate Transaction代码,否则数据库没有反应。此时Hibernate的Transaction就是Connection.commit而已

  2、在JTA上使用Hibernate 写JTA的Transaction代码,不要写Hibernate的Transaction代码,否则程序会报错

  3、在EJB上使用Hibernate 什么Transactioin代码都不要写,在EJB的部署描述符里面配置

  |---CMT(Container Managed Transaction)
  |
  |---BMT(Bean Managed Transaction)
  |
  |----JDBC Transaction
  |
  |----JTA Transaction

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows 11中无法保存更改照片应用程序错误 Windows 11中无法保存更改照片应用程序错误 Mar 04, 2024 am 09:34 AM

如果您在Windows11中使用照片应用程序进行图像编辑时遇到无法保存更改的错误,本文将为您提供解决方案。无法保存更改。保存时出错。请稍后再试.通常会出现这种问题的原因包括权限设置不正确、文件损坏或系统故障。因此,我们经过深入研究,整理出一些最有效的故障排除步骤,以帮助您解决此问题,并确保您可以继续在Windows11设备上无缝使用MicrosoftPhotos应用程序。修复Windows11中无法保存更改照片应用程序的错误许多用户在不同的论坛上一直在谈论MicrosoftPhotos应用程序错

MS Paint在Windows 11中无法正常工作 MS Paint在Windows 11中无法正常工作 Mar 09, 2024 am 09:52 AM

MicrosoftPaint在Windows11/10中不起作用吗?嗯,这似乎是一个常见的问题,我们有一些很好的解决方案来解决这个问题。用户一直抱怨说,当试图使用MSPaint时,无法工作或打开。应用程序中的滚动条不起作用,粘贴图标没有显示,崩溃,等等。幸运的是,我们收集了一些最有效的故障排除方法来帮助您解决MicrosoftPaint应用程序的问题。为什么MicrosoftPaint不起作用?MSPaint无法在Windows11/10PC上运行的一些可能原因如下:安全标识符已损坏。挂起的系统

如何将Apple Vision Pro连接到PC 如何将Apple Vision Pro连接到PC Apr 08, 2024 pm 09:01 PM

AppleVisionPro头戴式设备本身与电脑不兼容,因此您必须将其配置为连接到Windows电脑。自推出以来,AppleVisionPro一直备受追捧,拥有其尖端功能和广泛的可操作性,很容易理解原因。虽然您可以对其进行一些调整以适应PC,并且其功能在很大程度上取决于AppleOS,因此其功能将受到限制。如何将AppleVisionPro连接到我的电脑?1.验证系统要求你需要最新版本的Windows11(不支持自定义电脑和Surface设备)支持64位2GHZ或更快的快速处理器高性能GPU,最

Shazam应用程序在iPhone中无法运行:修复 Shazam应用程序在iPhone中无法运行:修复 Jun 08, 2024 pm 12:36 PM

iPhone上的Shazam应用程序有问题?Shazam可帮助您通过聆听歌曲找到歌曲。但是,如果Shazam无法正常工作或无法识别歌曲,则必须手动对其进行故障排除。修复Shazam应用程序不会花费很长时间。因此,无需再浪费时间,请按照以下步骤解决Shazam应用程序的问题。修复1–禁用粗体文本功能iPhone上的粗体文本可能是Shazam无法正常运行的原因。步骤1–您只能从iPhone设置中执行此操作。所以,打开它。步骤2–接下来,打开其中的“显示和亮度”设置。步骤3–如果您发现启用了“粗体文本

四款值得推荐的AI辅助编程工具 四款值得推荐的AI辅助编程工具 Apr 22, 2024 pm 05:34 PM

这个AI辅助编程工具在这个AI迅速发展的阶段,挖掘出了一大批好用的AI辅助编程工具。AI辅助编程工具能够提高开发效率、改善代码质量、降低bug率,是现代软件开发过程中的重要助手。今天大姚给大家分享4款AI辅助编程工具(并且都支持C#语言),希望对大家有所帮助。https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。Git

将照片从旧版照片移动到Windows 11中的新照片应用程序 将照片从旧版照片移动到Windows 11中的新照片应用程序 Mar 10, 2024 am 09:37 AM

本文将指导您如何将照片从PhotosLegacy迁移至Windows11中的新Photos应用程序。微软在Windows11中引入了经过改进的Photos应用程序,为用户提供了更简洁且功能更丰富的体验。新的Photos应用程序在对照片进行分类方面与过去的PhotosLegacy应用程序有所不同。它会将照片像其他Windows文件一样整理到文件夹中,而不是创建专辑。然而,仍在使用PhotosLegacy应用程序的用户可以轻松将他们的照片迁移至MicrosoftPhotos的新版本中。什么是Phot

为什么会出现0xc0000142错误码 为什么会出现0xc0000142错误码 Feb 25, 2024 am 11:15 AM

0xc0000142是指Windows系统中的错误代码,它通常与程序或应用程序无法正常启动或运行的问题相关。当用户尝试打开某个程序时,系统会显示错误信息"0xc0000142",并且该程序无法继续运行。那么,为什么会出现0xc0000142错误呢?造成这种错误代码的原因有很多种,下面是一些常见的原因和解决方法。配置文件损坏:某些程序的配置文件可能被损坏,导致

学习如何利用Go语言开发移动应用程序 学习如何利用Go语言开发移动应用程序 Mar 28, 2024 pm 10:00 PM

Go语言开发移动应用程序教程随着移动应用市场的不断蓬勃发展,越来越多的开发者开始探索如何利用Go语言开发移动应用程序。作为一种简洁高效的编程语言,Go语言在移动应用开发中也展现出了强大的潜力。本文将详细介绍如何利用Go语言开发移动应用程序,并附上具体的代码示例,帮助读者快速入门并开始开发自己的移动应用。一、准备工作在开始之前,我们需要准备好开发环境和工具。首

See all articles