通过Spring集成从Hibernate 3迁移到4

本周是时候将我们的代码库升级到最新的Hibernate 4.x了。 我们推迟了迁移(仍在Hibernate 3.3上),因为3.x分支的较新维护版本需要对API进行一些更改,这些更改显然仍在不断变化中。 一个示例是UserType API,该API仍然存在缺陷,将在Hibernate 4中完成。迁移非常顺利。 使UserType适应新界面非常简单。 到处都有一些刺激,但没有痛苦。

需要注意的是Spring集成。 如果您以前将Spring与Hibernate结合使用,则将使用LocalSessionFactoryBean (或AnnotationSessionFactoryBean )创建SessionFactory 。 对于休眠4
在自己的程序包中有一个单独的程序:org.springframework.orm。 hibernate4而不是org.springframework.orm。 休眠3 。 hibernate 4包中的LocalSessionFactoryBean将同时用于映射文件和带注释的实体,因此两种样式都只需要一个。

升级完成后,我们的所有测试都在运行,并且使用本地Hibernate事务管理器在Tomcat上的应用程序也运行良好。 但是,当使用JTA事务(和Spring的JtaTransactionManager )在Glassfish上运行时,在调用sessionFactory.getCurrentSession()时,我们得到了“未找到当前线程的会话”

因此,似乎我错过了与JTA配置有关的内容。 像通常使用Spring-Hibernate集成一样,让Spring驱动事务。 您指定一个事务管理器,Spring确保所有资源都已在事务管理器中注册,并最终调用提交或回滚。 Spring将与Hibernate集成,因此可确保在事务提交之前刷新会话。

使用hibernate 3和hibernate 3 Spring集成时,会话绑定到本地线程。 此技术使您可以使用sessionFactory.getCurrentSession()获取活动事务中任何位置的打开会话。 本地HibernateTransactionManagerJtaTransactionManager都是这种情况。 但是,从hibernate 4集成开始,hibernate会话将绑定到当前正在运行的JTA事务。

从用户的角度来看,什么都没有改变,因为sessionFactory.getCurrentSession()仍会完成其工作。 但是,当运行JTA时,这意味着Hibernate必须能够查找事务管理器以能够向当前正在运行的事务中注册会话。 如果您来自带有Spring的Hibernate 3,这是新的,实际上,您不必在Hibernate SessionFactory (或LocalSessionFactoryBean )配置中配置任何与事务有关的内容。 事实证明,通过Hibernate 4 Spring集成,事务管理器查找配置实际上是由hibernate完成的,而不是由Spring的LocalSessionFactoryBean完成的 。 解决方案非常简单。 将其添加到Hibernate( LocalSessionFactoryBean )配置中解决了我们的问题:

<prop key="hibernate.transaction.jta.platform">
org.hibernate.service.jta.platform.internal.SunOneJtaPlatform
</prop>

然后,应将“ SunOneJtaPlatform”替换为反映您的容器的子类。

有关可用的子类,请参阅API文档 。 此类实际上是在告诉Hibernate如何为您的环境查找事务管理器。 如果您不进行配置,则Hibernate不会将会话绑定到任何东西,因此不会引发异常。 还有一个属性:

hibernate.current_session_context_class

它应该指向org.springframework.orm.hibernate4.SpringSessionContext ,但这是由LocalSessionFactoryBean自动完成的,因此无需在配置中指定它。

解决了我的“当前会话未找到会话”问题后,还有另一个问题。 成功提交事务后,将看不到对事务内部的数据库所做的更改。 经过一番研究,我发现没有人在调用session.flush() 。 在进行hibernate 3集成时,注册了SpringSessionSynchronization ,它将在事务提交之前(在beforeCommmit方法中)调用session.flush( )。

在hibernate 4集成中,注册了SpringFlushSynchronization顾名思义 ,它还将执行刷新。 但是,这仅在TransactionSynchronization的实际“刷新”方法中实现,并且永远不会调用此方法。

我在Spring Bugtracker上对此提出了一个问题 ,其中包括两个示例应用程序,它们清楚地说明了该问题。 第一个使用的是Hibernate 3,另一个使用的是完全相同的应用程序,但是这次使用的是hibernte4。第二个将显示实际上没有任何信息持久化到数据库中(两个应用程序都在最新的Glassfish 3.1.2下进行了测试)。似乎正在创建一个环绕@Transactional注释的冲洗Aspect。 使用order属性,可以命令在刷新Aspect之前应用事务注释。 这样,您的Aspect仍在事务内部运行,并且能够刷新会话。 它可以通过注入SessionFactory (一种方式或另一种方式)然后调用sessionFactory.getCurrentSession()。flush()来以正常方式获取会话。

<tx:annotation-driven order="1"><bean id="flushinAspect" clas="..."><property name="order" value="2">
</property></bean>
</tx:annotation-driven>

或者,如果使用注释配置:

@EnableTransactionManagement(order=1)

更新:

关于此问题有一些反馈。 事实证明,这似乎不是Spring Hibernate集成中的错误,而是缺少的Hibernate配置元素。 显然,“ hibernate.transaction.factory_class”需要设置为JTA,默认值为JDBC,它依赖于Hibernate Transaction API进行显式事务管理。 通过将此设置为JTA,休眠将注册必要的同步,该同步将执行刷新。 见春
https://jira.springsource.org/browse/SPR-9404

更新2:

事实证明,在按照上一个问题建议的配置进行纠正后,仍然存在问题。 我将不重复任何事情,您可以在我在此处提交的第二个错误条目中找到详细信息: https : //jira.springsource.org/browse/SPR-9480它基本上可以归结为在JTA场景中在配置了JtaTransactionFactory的情况下,hibernate不会检测到它在事务中,因此将不执行中间刷新。 配置了JtaTransactionFactory之后,您应该通过Hibernate API而不是外部(在我们的例子中为Spring)机制来控制事务。 副作用之一是在某些情况下您可能正在读取陈旧的数据。

例:

//[START TX1]
Query query = session.createQuery('from Person p where p.firstName = :firstName and p.lastName = :lastName');
Person johnDoe = (Person)query.setString('firstName','john').setString('lastName','doe').uniqueResult();
johnDoe.setFirstName('Jim');
Person jimDoe = (Person)query.setString('firstName','jim').setString('lastName','doe').uniqueResult();
//[END TX1]

发生的情况是,在第5行执行第二个查询时,hibernate应该检测到它应该刷新对第4行的附加实体所做的先前更新(将名称从“ john”更新为“ jim”)。 但是,由于休眠不知道它在一个活动事务中运行,因此中间刷新不起作用。 在事务提交之前,它将仅刷新一次。 这会导致数据过时,因为第二个查询将找不到“ jim”,而是返回null。 解决方案(请参阅问题中Juergen Hoeller的答复)是将hibernate.transaction.factory_class配置为org.hibernate.transaction.CMTTransactionFactory 。 刚开始我有点怀疑,因为CMT使EJB容器成为现实。 但是,如果您阅读有关CMTTransaction的Java文档,则确实有道理:

/*** Implements a transaction strategy for Container Managed Transaction (CMT) scenarios.  All work is done in* the context of the container managed transaction.** The term 'CMT' is potentially misleading; the pertinent point simply being that the transactions are being* managed by something other than the Hibernate transaction mechanism.** Additionally, this strategy does *not* attempt to access or use the {@link javax.transaction.UserTransaction} since* in the actual case CMT access to the {@link javax.transaction.UserTransaction} is explicitly disallowed.  Instead* we use the JTA {@link javax.transaction.Transaction} object obtained from the {@link TransactionManager}

之后,一切似乎都正常。 综上所述,如果您希望休眠状态通过UserTransaction管理JTA事务,则应使用JtaTransactionFactory。 在这种情况下,您必须使用Hibernate API来控制事务。 如果还有其他人管理事务(Spring,EJB容器……),则应改用CMTTransactionFactory。 然后,通过使用javax.transaction.TransactionManager检查活动的javax.transaction.Transaction,Hibernate将恢复为注册同步。 如果弹出任何其他问题,我将相应地更新此条目。

参考:在Koen Serneels –技术博客博客上,我们的JCG合作伙伴 Koen Serneels 通过Spring集成从Hibernate 3迁移到4 。

翻译自: https://www.javacodegeeks.com/2013/03/migrating-from-hibernate-3-to-4-with-spring-integration.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端工程师全套教程免费分享

这是我自己早前听课时整理的前端全套知识点&#xff0c;适用于初学者&#xff0c;也可以适用于中级的程序员&#xff0c;你们可以下载下来。我自认为还是比较系统全面的&#xff0c;可以抵得上市场上90%的学习资料。讨厌那些随便乱写的资料还有拿出来卖钱的人&#xff01;在这里…

vb在服务器上新建文件夹,vb.net-如果不存在,如何在VB中创建文件夹?

vb.net-如果不存在&#xff0c;如何在VB中创建文件夹&#xff1f;我为自己编写了一个小小的下载应用程序&#xff0c;以便我可以轻松地从服务器上获取一组文件&#xff0c;然后将它们全部放入带有全新安装的Windows的新PC上&#xff0c;而无需实际运行网络。 不幸的是&#xff…

mybatis一对一联表查询的两种常见方式

1.一条语句执行查询&#xff08;代码如下图&#xff09; 注释&#xff1a;class表&#xff08;c别名&#xff09;&#xff0c;teacher表&#xff08;t别名&#xff09;teacher_id为class表的字段t_id为teacher表的字段&#xff0c;因为两者有主键关联的原因&#xff0c;c_id为c…

在Windows 7中设置Java开发环境

一段时间以来&#xff0c;我收到了很多愿意尝试Java语言的学生和人们的要求&#xff0c;它们提供了关于如何设置Java开发环境的简单指南&#xff0c;类似于我一年前写的那样。 Mac用户。 看到这里和这里 。 因此&#xff0c;本文主要针对Java开发新手&#xff0c;他们寻求有关使…

写给想成为前端工程师的同学们―前端工程师是做什么的?

前端工程师是做什么的&#xff1f; 前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲&#xff0c;前端工程师使用 HTML、CSS、JavaScript 等专业技能和工具将产品UI设计稿实现成网站产品&#xff0c;涵盖用户PC端、移动端网页&#xff0c;处理视觉…

逆水寒服务器维护7.5,逆水寒7.26日维护到什么时候 逆水寒7.26日游戏改动汇总介绍...

逆水寒7.26日维护到什么时候 逆水寒7.26日游戏改动汇总介绍2018-07-26 10:08:08来源&#xff1a;游戏下载编辑&#xff1a;苦力趴评论(0)《逆水寒》官方发布微博&#xff0c;称为了保证服务器的运行稳定和服务质量&#xff0c;将于7月26日上午7:00-上午10:00进行停服维护。此次…

是否可以限制蓝牙传输距离_技术文章—关于蓝牙传输范围的常见误解

蓝牙技术在耳机、手机、手表及汽车领域的普及为人们带来了许多便利&#xff0c;却也引发了一些人们对于蓝牙的误解。目前&#xff0c;蓝牙可为多种重要的解决方案提供支持&#xff0c;其中包括家庭自动化、室内导航以及商业和工业创新等。误解一&#xff1a;蓝牙稳定传输的最远…

shell 统计行数

语法&#xff1a;wc [选项] 文件… 说明&#xff1a;该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名&#xff0c;则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。 该命令各选项含义如下&#xff1a; - c 统计字节数…

Async分析

1&#xff1a;android在新版本中不允许UI线程访问网络&#xff0c;但是如果需要访问网络又改怎么办呐&#xff1f;这里有很多解决方案&#xff0c;比如新开一个线程&#xff0c;在新线程中进行访问&#xff0c;然后访问数据&#xff0c;返回后可能会更新界面也可能不更新界面&a…

JavaFX即将推出您附近的Android或iOS设备吗?

已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开源更新中 &#xff0c; Richard Bair汇编了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0c;星期一&#xff0…

基于webpack搭建的vue element-ui框架

花了1天多的时间&#xff0c; 终于把这个框架搭建起来了。 好了&#xff0c; 不多说了&#xff0c; 直接进入主题了。前提是安装了nodejs,至于怎么安装&#xff0c; 网上都有教程。 这里就不多说了&#xff0c; 这边使用的IDE是idea。1.在E:/my-project&#xff08;我的电脑上&…

mvc怎么请求服务器错误信息,asp.net-mvc – IIS显示服务器错误而不是自定义错误...

我正在使用MVC 5,我正在使用自定义视图处理我的错误,例如(404,403 ……等)它在我的本地IIS上工作正常,但是当我在登台服务器上发布时,它显示有关这些错误代码的IIS服务器错误消息.它显示了这条消息&#xff1a;代替&#xff1a;我修改了web.config for< customErrors mode “…

编译打包vue_Vue 源码分析( 一 )

Vue 源码分析&#xff08; 一 &#xff09;目录结构、版本、入口1、Vue 源码目录结构dist&#xff1a;打包之后生成的结果目录 examples&#xff1a;代码示例 scripts&#xff1a;配置文件 src&#xff1a;源代码目录compiler: 编译相关 &#xff08;将template模板转换成rende…

List 集合转换 json 字符串 ajax前台拼接

List 集合 转换为json 字符串public object Taoshow(){var i pbll.PackShow();//list集合var lida JsonConvert.SerializeObject(i); //转换成json字符串return lida;}function Tao() {$.ajax({url: "/Wangjie/Taoshow",type: "Get",dataType: "Jso…

【数论想法题】小C的问题 @科林明伦杯哈尔滨理工大学第八届程序设计竞赛...

Time Limit: 1000 MS Memory Limit: 256000 K Description 小C是一个可爱的女孩&#xff0c;她特别喜欢世界上最稳定的图形&#xff1a;三角形。有一天她得到了n根木棍&#xff0c;她把这些木棍随意的摆放成一行。小K来和小C玩&#xff0c;他发现了这排木棍&#xff0c;突然想…

使用grep4j轻松测试分布式组件上的SLA

因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到任何消费者的…

16进制颜色识别和搭配规律

在CSS中&#xff0c;经常会用到16进制的颜色来设置文本、背景、边框等颜色&#xff0c;但是对于一个纯前端来讲&#xff0c;16进制颜色的识别和搭配可能会较为陌生了 ,本文简单介绍一下16进制颜色的一些规律 16进制颜色的数值意义&#xff1a; 举个例子&#xff1a;比如 #1A2B…

iis服务器显示http1.1,IIS服务器“500”内部错误 HTTP/1.1 新建会话失败

IIS服务器“500”内部错误 访问asp :HTTP/1.1 新建会话失败1.重命名 %SystemRoot%\System32\Clbcatq.dll 为 %SystemRoot%\System32\~Clbcatq.dll2.重启动,删除注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下的com33.进入:cmd.exe进windows目录下输入:rd /s /q Registration …

Python+Appium环境搭建

1、python环境搭建&#xff0c;这里就不做过多介绍 2、安装 node.js 2.1、官网下载node.js&#xff1a;https://nodejs.org/en/download/ 2.2、获取到安装文件后&#xff0c;直接双击安装文件&#xff0c;根据程序的提示&#xff0c;完成nodejs的安装。 2.3、安装完成后&#x…

怎么弄出满屏幕的字_怎么把屏幕字体全部显示出来

2020-05-24阅读(30)本文主要为您介绍被别人用手机号买了票怎么办&#xff0c;内容包括别人用我的手机号,买了火车票怎么办&#xff0c;有人用我的手机号买了火车票怎么办&#xff0c;有人用我的手机号买了火车票怎么办。手机号被别人绑定买火车票了&#xff0c;可以将手机号直接…