Spring3 + JPA2 + Java EE6 App Server =配置混乱

Spring很棒,JavaEE6很棒,最新的JavaEE6 Application服务器也很棒。 这篇文章不是Spring Vs JavaEE6上的专栏文章,而是我在JBoss AS-7.1 App Server上移植Spring3 + JPA2(Hibernate)应用程序的经验。

我的应用程序要求非常简单:使用Spring3.1和JPA2(休眠)开发几个基于SOAP的Web服务,并将其托管在JBoss AS 7.1上。

因此,我开始创建一个多模块maven项目,其中一个jar模块包含使用Spring&JPA的服务实现,另一个war模块将该服务公开为基于SOAP的Web服务。 但是关键部分是服务需要针对某些服务方法与多个数据库进行对话。

我知道从Spring获得的JPA2集成支持,但没有persistence.xml和很酷的packagesToScan属性,这使工作变得更轻松。 我配置了2个数据源,2个LocalContainerEntityManagerFactoryBeans,注册了2个JpaTransactionManagers并启用了基于注释的事务管理支持。

<tx:annotation-driven transaction-manager='txnManager1'/><tx:annotation-driven transaction-manager='txnManager2'/><bean class='org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor'/><bean class='org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor'/><!-- This will throw error because it found multiple EntityManagerFactory beans --><bean id='txnManager1' class='org.springframework.orm.jpa.JpaTransactionManager'p:entityManagerFactory-ref='emf1'/><bean id='txnManager2' class='org.springframework.orm.jpa.JpaTransactionManager'p:entityManagerFactory-ref='emf2'/>         <bean id='emf1' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs1PU'></property>        <property name='dataSource' ref='dataSource1'></property><property name='jpaVendorAdapter'><bean id='jpaAdapter' class='org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter'p:showSql='${hibernate.show_sql}'/></property><property name='jpaProperties'><props><prop key='hibernate.dialect'>${hibernate.dialect}</prop><prop key='hibernate.hbm2ddl.auto'>${hibernate.hbm2ddl.auto}</prop></props></property><property name='packagesToScan' value='com.sivalabs.springdemo.entities'></property><property name='loadTimeWeaver'><bean class='org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver'/></property></bean> <bean id='emf2' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs2PU'></property><property name='dataSource' ref='dataSource2'></property><property name='jpaVendorAdapter'><bean id='jpaAdapter' class='org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter'p:showSql='${hibernate.show_sql}'/></property><property name='jpaProperties'><props><prop key='hibernate.dialect'>${hibernate.dialect}</prop><prop key='hibernate.hbm2ddl.auto'>${hibernate.hbm2ddl.auto}</prop></props></property><property name='packagesToScan' value='com.sivalabs.springdemo.entities'></property><property name='loadTimeWeaver'><bean class='org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver'/></property></bean> <bean id='dataSource1' class='org.apache.commons.dbcp.BasicDataSource'><property name='driverClassName' value='${node1.jdbc.driverClassName}'></property><property name='url' value='${node1.jdbc.url}'></property><property name='username' value='${node1.jdbc.username}'></property><property name='password' value='${node1.jdbc.password}'></property></bean><bean id='dataSource2' class='org.apache.commons.dbcp.BasicDataSource'><property name='driverClassName' value='${node2.jdbc.driverClassName}'></property><property name='url' value='${node2.jdbc.url}'></property><property name='username' value='${node2.jdbc.username}'></property><property name='password' value='${node2.jdbc.password}'></property></bean>

此后,我意识到将Entitymanager与正确的PersistenceUnit绑定,我需要将persistenceUnitName赋予LocalContainerEntityManagerFactoryBean。

<bean class='org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor'><property name='persistenceUnits' ><map><entry key='unit1' value='Sivalabs1PU'/><entry key='unit2' value='Sivalabs2PU'/></map></property></bean><bean id='emf1' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs1PU'></property><property name='dataSource' ref='dataSource1'></property>........        </bean> <bean id='emf2' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs2PU'></property><property name='dataSource' ref='dataSource2'></property>........        </bean>

然后在我的Service Bean中,将EntityManager和事务管理器粘合在一起,如下所示:

@Service
public class AdminUserService implements UserService
{@PersistenceContext(unitName='Sivalabs1PU')private EntityManager sivalabs1EM;@PersistenceContext(unitName='Sivalabs2PU')private EntityManager sivalabs2EM;@Override@Transactional('txnManager1')public List<User> getAllUsersFromSivalabs1DB() {return sivalabs1EM.createQuery('from User', User.class).getResultList();}@Override@Transactional('txnManager2')public List<User> getAllUsersFromSivalabs2DB() {return sivalabs2EM.createQuery('from User', User.class).getResultList();}}

现在,通过此设置,我得到了异常提示“找不到名称为'Sivalabs1PU'的持久性单元”。 然后,在进行一些谷歌搜索之后,我创建了META-INF / persistence.xml文件,如下所示:

<persistence><persistence-unit name='Sivalabs1PU' transaction-type='RESOURCE_LOCAL'>     </persistence-unit><persistence-unit name='Sivalabs2PU'  transaction-type='RESOURCE_LOCAL'>     </persistence-unit></persistence>

现在,持久性单元名称错误得到解决,并出现其他异常,说明“未从[用户]映射用户”。 User类使用@Entity注释,并且位于“ com.sivalabs.springdemo.entities ”包中,我将其配置为“ packagesToScan ”属性。 我不明白为什么'packagesToScan'属性不起作用,如果没有persistence.xml,它会很好地工作。 所以暂时我在persistence.xml文件中配置了实体类。

<persistence><persistence-unit name='Sivalabs1PU' transaction-type='RESOURCE_LOCAL'>    <class>com.sivalabs.springdemo.entities.User</class>   </persistence-unit><persistence-unit name='Sivalabs2PU'  transaction-type='RESOURCE_LOCAL'>    <class>com.sivalabs.springdemo.entities.User</class></persistence-unit></persistence>

最终,当我运行调用AdminUserService方法的JUnit测试时,一切看起来都很好并且工作正常。 然后,我在JBoss AS 7.1服务器上部署了war文件,然后再次出现了很多错误。 JBoss抱怨“当未设置“ hibernate.dialect”时,Connection不能为空”。 '[PersistenceUnit:Sivalabs1PU]无法建立EntityManagerFactory。

经过几分钟的思考,我了解到JBoss服务器正在尝试执行“配置约定”规则应做的事情。 JBoss试图创建EntityManagerFactory,因为它在类路径中找到了META-INF / persistence.xml。 但是由于它不包含jdbc连接细节,因此引发了Error。

再次谷歌搜索之后,我发现我们可以将persistence.xml重命名为其他名称(spring-persistence.xml),并使用Spring将此新名称连接起来,如下所示:

<bean id='emf1' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs1PU'></property><property name='persistenceXmlLocation' value='classpath:META-INF/spring-persistence.xml'/><property name='dataSource' ref='dataSource1'></property>........        </bean> <bean id='emf2' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='persistenceUnitName' value='Sivalabs2PU'></property><property name='persistenceXmlLocation' value='classpath:META-INF/spring-persistence.xml'/><property name='dataSource' ref='dataSource2'></property>........        </bean>

最终,我成功地使该应用程序在JBoss AS 7.1上运行(仍然不知道还有多少其他漏洞)。

但是在这里我不了解Spring的一些概念:
1.当我尝试提供persistenceUnitName时,为什么Spring正在检查该名称是否存在于persistence.xml中? 无论如何,persistence.xml不含任何单元名称!
2.为什么在与persistence.xml一起使用时packagesToScan机制失败? 是弹簧虫吗?

一切似乎都正常,只是缺少一件事,在我与Spring和Tomcat一起工作时通常会露出微笑:-(

我非常喜欢Spring框架,自2006年以来一直在使用它,在编写Spring代码的同时我非常喜欢。 这并不意味着我不喜欢CDI,EJB3,JAX-RS :-)

无论如何,通过以上所有练习,我感觉就像Spring3 + JPA2 + JavaEE6AppServer = Confusion Over Configuration ,这只是我(一个普通的Java开发人员)的意见。

再说一次:Spring很棒,JavaEE6很棒,最新的JavaEE6 Application服务器也很棒:-)。

参考: Spring3 + JPA2 + JavaEE6AppServer =来自我们的JCG合作伙伴 Siva Reddy的“配置混乱”,来自My Experiments on Technology博客。


翻译自: https://www.javacodegeeks.com/2012/10/spring3-jpa2-java-ee6-app-server.html

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

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

相关文章

python面向对象进阶(1)

面向对象进阶 isinstance(obj,cls) 检查是否obj是类cls的对象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 检查sub是否是super的派生类class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向对象中的反射&#xff…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受&#xff0c;从提高幅度上来讲&#xff0c;而不是重要性上来讲一、自锁起码提高你50%的速度&#xff0c;我不用自锁和别人一起走AVS25就很辛苦了&#xff0c;用了自锁&#xff0…

ansys matlab 调用,matlab 调用ansys (转载)

问题的提出&#xff1a;我们经常会需要用ansys计算一些东西&#xff0c;之后再用matlab来处理计算的结果。当修改某些参数重复上述过程的时候&#xff0c;就比较容易出现问题——比如ansys模型中的参数和matlab程序中参数的一致性问题等。这时可以考虑采用下面的协同工作的方法…

本地存储之sessionStorage

源码可以到GitHub上下载&#xff01; sessionStorage&#xff1a; 关闭浏览器再打开将不保存数据 复制标签页会连同sessionStorage数据一同复制 复制链接地址打开网页不会复制seessionStorage内的数据 清除缓存加载当前页对页面无影响 1) 同源策略限制。若想在不同页面之间对同…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您&#xff01;穿越十年的一个ZEMAX光学设计案例作者&#xff1a;窗台小绿萝CAD&#xff0c;这个词已经深入到学习、工作很多年&#xff0c;翻译过来就是Computer Aided Design&#xff0c;计算机辅助设计。随着…

Java本质和性能

最初的问题是如何计算二进制数中1的个数&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比较&#xff0c;该性能可以转换为固有特性&#xff0c;即单个机器代码指令POPCNT和执行相同功能的Java代码。 题 如何计算二进制数中1的个数&#xff1f; 假…

spring RequestMapping 包含http的部分以及各部分详解

RequestMapping有四个参数&#xff0c;分别为&#xff1a;1、value&#xff1a;表示请求URL2、method&#xff1a;表示请求方法3、params&#xff1a;表示请求参数4、headers&#xff1a;表示请求头 【例如】&#xff1a;RequestMapping(value"/testRequestMapping",…

【ZBH选讲·拍照】

【问题描述】 假设这是一个二次元。LYK召集了n个小伙伴一起来拍照。他们分别有自己的身高Hi和宽度Wi。为了放下这个照片并且每个小伙伴都完整的露出来&#xff0c;必须需要一个宽度为ΣWi&#xff0c;长度为max{Hi}的相框。&#xff08;因为不能叠罗汉&#xff09;。LYK为了节省…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP&#xff0c;但又不清楚 PHP 基础学什么&#xff0c;那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前&#xff0c;首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后&#xff0c;能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些&#xff1f;生鲜电商特点&#xff1a;1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性&#xff1b;2,生鲜食品需要保鲜、冷藏、冷冻&#xff1b;3,生鲜食品保质期比较短&#xff1b;保存不易、对物流配送的条件要求极高&#xff1b;4,生鲜商品…

遇到短信轰炸,别人换ip调你的短信接口怎么办

前端开发者很容易暴露自己的请求地址和参数&#xff0c;我们都知道&#xff0c;一个h5页面&#xff0c;按 F12 是可以看到页面的源码的&#xff0c;所以经常很多人会利用这一点恶意调取别人的接口。 我们公司出现了好多次短信接口被大量调用&#xff0c;导致一天发了几万条短信…

UVa 10170 - The Hotel with Infinite Rooms

题目&#xff1a;求从s開始的递增序列&#xff08;每次加1&#xff09;。求出他们加和不小于D的那个最后的加数。 分析&#xff1a;数学题。分治。s s1 ... n n*&#xff08;n1&#xff09;/2 - s*&#xff08;s-1&#xff09;/2 &#xff08;ns&#xff09;*&#xff08;…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规范示例。 这些“…

linux rsync删文件速度,为什么用rsync删除大量文件的时候比用rm快

为什么用rsync删除大量文件的时候比用rm快今天研究怎么在Linux下快速删除大量文件&#xff0c;搜到很多人都说可以用rsync来删除大量文件&#xff0c;速度比rm要快很多&#xff0c;但是没有人说为什么&#xff0c;仔细研究了一下原因&#xff0c;总结起来大概就是&#xff0c;一…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位&#xff0c;一个字节可以存放0~255共256个数字&#xff1b;有符号位存放-128~127共256个数字&#xff1b; 2、无符号全都表示为正数&#xff1b;有符号位则首位表示正负数&#xff0c;正数首位为0&#xff0c;负数首位为1&#xff08;因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合&#xff0c;包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900&#xff0c;和一款面向5G网络处理的结构化ASIC&#xff0c;一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片&#xff0c;网速过慢的朋友请移步>>> &#xff08;原文&#xff09;canvas 离屏技术与放大镜实现。 更多讨论或者错误提交&#xff0c;也请移步。 利用canvas除了可以实现滤镜&#xff0c;还可以利用离屏技术放大镜功能。为了方…

虚拟机下安装ubuntu后root密码设置

问题描述&#xff1a; 在虚拟机下安装了ubuntu中要输入用户名&#xff0c;一般情况下大家都会输入一个自己的网名或绰号之类的&#xff0c;密码也在这时设置过了。 但是当安装成功之后&#xff0c;使用命令#su root&#xff0c;然后输入刚才设置的密码&#xff0c;发现密码错误…