易语言可以做网站,自己怎么做拼单网站,设计网站,超级外链工具有用吗Spring很棒#xff0c;JavaEE6很棒#xff0c;最新的JavaEE6 Application服务器也很棒。 这篇文章不是Spring Vs JavaEE6上的专栏文章#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2#xff08;Hibernate#xff09;应用程序的经验。 我的应用程序要求非… Spring很棒JavaEE6很棒最新的JavaEE6 Application服务器也很棒。 这篇文章不是Spring Vs JavaEE6上的专栏文章而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2Hibernate应用程序的经验。 我的应用程序要求非常简单使用Spring3.1和JPA2休眠开发几个基于SOAP的Web服务并将其托管在JBoss AS 7.1上。 因此我开始创建一个多模块maven项目其中一个jar模块包含使用SpringJPA的服务实现另一个war模块将该服务公开为基于SOAP的Web服务。 但是关键部分是服务需要针对某些服务方法与多个数据库进行对话。 我知道从Spring获得的JPA2集成支持但没有persistence.xml和很酷的packagesToScan属性这使工作变得更轻松。 我配置了2个数据源2个LocalContainerEntityManagerFactoryBeans注册了2个JpaTransactionManagers并启用了基于注释的事务管理支持。 tx:annotation-driven transaction-managertxnManager1/tx:annotation-driven transaction-managertxnManager2/bean classorg.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor/bean classorg.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor/!-- This will throw error because it found multiple EntityManagerFactory beans --bean idtxnManager1 classorg.springframework.orm.jpa.JpaTransactionManagerp:entityManagerFactory-refemf1/bean idtxnManager2 classorg.springframework.orm.jpa.JpaTransactionManagerp:entityManagerFactory-refemf2/ bean idemf1 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs1PU/property property namedataSource refdataSource1/propertyproperty namejpaVendorAdapterbean idjpaAdapter classorg.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterp:showSql${hibernate.show_sql}//propertyproperty namejpaPropertiespropsprop keyhibernate.dialect${hibernate.dialect}/propprop keyhibernate.hbm2ddl.auto${hibernate.hbm2ddl.auto}/prop/props/propertyproperty namepackagesToScan valuecom.sivalabs.springdemo.entities/propertyproperty nameloadTimeWeaverbean classorg.springframework.instrument.classloading.InstrumentationLoadTimeWeaver//property/bean bean idemf2 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs2PU/propertyproperty namedataSource refdataSource2/propertyproperty namejpaVendorAdapterbean idjpaAdapter classorg.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterp:showSql${hibernate.show_sql}//propertyproperty namejpaPropertiespropsprop keyhibernate.dialect${hibernate.dialect}/propprop keyhibernate.hbm2ddl.auto${hibernate.hbm2ddl.auto}/prop/props/propertyproperty namepackagesToScan valuecom.sivalabs.springdemo.entities/propertyproperty nameloadTimeWeaverbean classorg.springframework.instrument.classloading.InstrumentationLoadTimeWeaver//property/bean bean iddataSource1 classorg.apache.commons.dbcp.BasicDataSourceproperty namedriverClassName value${node1.jdbc.driverClassName}/propertyproperty nameurl value${node1.jdbc.url}/propertyproperty nameusername value${node1.jdbc.username}/propertyproperty namepassword value${node1.jdbc.password}/property/beanbean iddataSource2 classorg.apache.commons.dbcp.BasicDataSourceproperty namedriverClassName value${node2.jdbc.driverClassName}/propertyproperty nameurl value${node2.jdbc.url}/propertyproperty nameusername value${node2.jdbc.username}/propertyproperty namepassword value${node2.jdbc.password}/property/bean 此后我意识到将Entitymanager与正确的PersistenceUnit绑定我需要将persistenceUnitName赋予LocalContainerEntityManagerFactoryBean。 bean classorg.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessorproperty namepersistenceUnits mapentry keyunit1 valueSivalabs1PU/entry keyunit2 valueSivalabs2PU//map/property/beanbean idemf1 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs1PU/propertyproperty namedataSource refdataSource1/property........ /bean bean idemf2 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs2PU/propertyproperty namedataSource refdataSource2/property........ /bean 然后在我的Service Bean中将EntityManager和事务管理器粘合在一起如下所示 Service
public class AdminUserService implements UserService
{PersistenceContext(unitNameSivalabs1PU)private EntityManager sivalabs1EM;PersistenceContext(unitNameSivalabs2PU)private EntityManager sivalabs2EM;OverrideTransactional(txnManager1)public ListUser getAllUsersFromSivalabs1DB() {return sivalabs1EM.createQuery(from User, User.class).getResultList();}OverrideTransactional(txnManager2)public ListUser getAllUsersFromSivalabs2DB() {return sivalabs2EM.createQuery(from User, User.class).getResultList();}} 现在通过此设置我得到了异常提示“找不到名称为Sivalabs1PU的持久性单元”。 然后在进行一些谷歌搜索之后我创建了META-INF / persistence.xml文件如下所示 persistencepersistence-unit nameSivalabs1PU transaction-typeRESOURCE_LOCAL /persistence-unitpersistence-unit nameSivalabs2PU transaction-typeRESOURCE_LOCAL /persistence-unit/persistence 现在持久性单元名称错误得到解决并出现其他异常说明“未从[用户]映射用户”。 User类使用Entity注释并且位于“ com.sivalabs.springdemo.entities ”包中我将其配置为“ packagesToScan ”属性。 我不明白为什么packagesToScan属性不起作用如果没有persistence.xml它会很好地工作。 所以暂时我在persistence.xml文件中配置了实体类。 persistencepersistence-unit nameSivalabs1PU transaction-typeRESOURCE_LOCAL classcom.sivalabs.springdemo.entities.User/class /persistence-unitpersistence-unit nameSivalabs2PU transaction-typeRESOURCE_LOCAL classcom.sivalabs.springdemo.entities.User/class/persistence-unit/persistence 最终当我运行调用AdminUserService方法的JUnit测试时一切看起来都很好并且工作正常。 然后我在JBoss AS 7.1服务器上部署了war文件然后再次出现了很多错误。 JBoss抱怨“当未设置“ hibernate.dialect”时Connection不能为空”。 [PersistenceUnitSivalabs1PU]无法建立EntityManagerFactory。 经过几分钟的思考我了解到JBoss服务器正在尝试执行“配置约定”规则应做的事情。 JBoss试图创建EntityManagerFactory因为它在类路径中找到了META-INF / persistence.xml。 但是由于它不包含jdbc连接细节因此引发了Error。 再次谷歌搜索之后我发现我们可以将persistence.xml重命名为其他名称spring-persistence.xml并使用Spring将此新名称连接起来如下所示 bean idemf1 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs1PU/propertyproperty namepersistenceXmlLocation valueclasspath:META-INF/spring-persistence.xml/property namedataSource refdataSource1/property........ /bean bean idemf2 classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceUnitName valueSivalabs2PU/propertyproperty namepersistenceXmlLocation valueclasspath:META-INF/spring-persistence.xml/property namedataSource refdataSource2/property........ /bean 最终我成功地使该应用程序在JBoss AS 7.1上运行仍然不知道还有多少其他漏洞。 但是在这里我不了解Spring的一些概念 1.当我尝试提供persistenceUnitName时为什么Spring正在检查该名称是否存在于persistence.xml中 无论如何persistence.xml不含任何单元名称 2.为什么在与persistence.xml一起使用时packagesToScan机制失败 是弹簧虫吗 一切似乎都正常只是缺少一件事在我与Spring和Tomcat一起工作时通常会露出微笑-( 我非常喜欢Spring框架自2006年以来一直在使用它在编写Spring代码的同时我非常喜欢。 这并不意味着我不喜欢CDIEJB3JAX-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