如何在JBoss 6.3 EAP上部署Spring托管的JPA应用程序

时间:2014-10-29 06:33:03

标签: java spring hibernate jpa jboss

我有一个java Web应用程序。此应用程序使用JPA进行持久性。持久性由春天管理。可以在Tomcat上轻松部署此应用程序,只需将war文件放在webapps中即可。但是在JBoss中部署这个应用程序已经成了我好几天的噩梦。我无法在这个网站上找到合适的帖子来解决问题,因此这篇文章。

1 个答案:

答案 0 :(得分:7)

首先,您需要配置数据源(我使用的是mysql数据库)。我的JBoss安装在C:\jboss-eap-6.3\下,我使用的是Windows操作系统。 脚步: 1.在com\mysql\main下创建目录结构C:\jboss-eap-6.3\modules。您最终会得到C:\jboss-eap-6.3\modules\com\mysql\main目录结构。 2.在此xml目录中创建module.xml文件main。另外,将mysql驱动程序jar mysql-connector-java-5.1.23-bin.jar放在同一目录中。最后,您将在module.xml中拥有mysql-connector-java-5.1.23-bin.jarC:\jboss-eap-6.3\modules\com\mysql\main。 3.将以下xml内容复制到module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
    <resources>
        <resource-root path="mysql-connector-java-5.1.23-bin.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

4。在standalone.xml目录中找到文件C:\jboss-eap-6.3\standalone\configuration。使用您喜欢的文本编辑器打开此文件。找到datasource子系统,即此行<subsystem xmlns="urn:jboss:domain:datasources:1.2">。在xml元素下添加drivers片段。

<driver name="mysqlDriver" module="com.mysql">
    <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
</driver>

xml元素下添加datasources片段:

<datasource jndi-name="java:jboss/datasources/MYSQLDATASOURCE" pool-name="MYSQLDATASOURCE" enabled="true" use-java-context="true">
    <connection-url>jdbc:mysql://localhost:3306/databaseName</connection-url>
    <driver>mysqlDriver</driver>
    <security>
    <user-name>root</user-name>
    <password>databasepassword</password>
    </security>
</datasource>   

此时您已完成datasource配置。

接下来是配置您的persistence.xmlapplicationContext.xml。 的的persistence.xml

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="erPU">
        <class>..</class> <!--Contains all your Entity classes-->
        <properties>            
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />
            <property name="jboss.as.jpa.providerModule" value="application" /> 
            <property name="jboss.as.jpa.managed" value="false" /> 
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>          
        </properties>
    </persistence-unit>    
</persistence>

<!--jboss.as.jpa.providerModule     is the name of the persistence provider module (default is org.hibernate). Should be hibernate3-bundled if Hibernate 3 jars are in the application archive (adapterModule and adapterClass will automatically be set for hibernate3-bundled).  Should be application, if a persistence provider is packaged with the application. -->
<!--jboss.as.jpa.managed    can be set to false to disable container managed JPA access to the persistence unit.  The default is true, which enables container managed JPA access to the persistence unit.  This is typically set to false for Seam 2.x + Spring applications. -->

<强>的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:tx="http://www.springframework.org/schema/tx"    

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">

    <context:annotation-config />   
    <context:component-scan base-package="..." /><!--Package base name to scan for annotations -->        

    <jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/MYSQLDATASOURCE" expected-type="javax.sql.DataSource"/>    
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />  
        <property name="packagesToScan" value="..." /><!--Packages to scan for entities--> 
        <property name="persistenceUnitName" value="erPU" />
        <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/> 
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.hbm2ddl.auto" value="update" />
                <entry key="hibernate.format_sql" value="false" />
                <entry key="hibernate.show_sql" value="false" />
                <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            </map>
        </property>
    </bean>       
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>   
</beans>

注意:无论persistence.xml的位置如何,您都需要告诉persistence.xml所在的春天。 literature below was extracted from

Using Spring-managed persistence units

Spring applications running in JBoss AS7 may also create persistence units on their own, using the LocalContainerEntityManagerFactoryBean. This is what these applications need to consider:
Placement of the persistence unit definitions

When the application server encounters a deployment that has a file named META-INF/persistence.xml (or, for that matter, WEB-INF/classes/META-INF/persistence.xml), it will attempt to create a persistence unit based on what is provided in the file. In most cases, such definition files are not compliant with the Java EE requirements, mostly because required elements such as the datasource of the persistence unit are supposed to be provided by the Spring context definitions, which will fail the deployment of the persistence unit, and consequently of the entire deployment.

Spring applications can easily avoid this type of conflict, by using a feature of the LocalContainerEntityManagerFactoryBean which is designed for this purpose. Persistence unit definition files can exist in other locations than META-INF/persistence.xml and the location can be indicated through the persistenceXmlLocation property of the factory bean class.

Assuming that the persistence unit is in the META-INF/jpa-persistence.xml, the corresponding definition can be:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
       <property name="persistenceXmlLocation" value="classpath*:META-INF/jpa-persistence.xml"/> 
       <!-- other definitions -->
</bean>

<强> WEB-INF / JBoss的部署-structure.xml 最后,您需要在jboss-deployment-structure.xml下创建WEB-INF。该文件的内容应为:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <exclusions>
       <module name="org.hibernate"/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>

原因是:

Since the LocalContainerEntityManagerFactoryBean and the corresponding HibernateJpaVendorAdapter are based on Hibernate 3, it is required to use that version with the application. Therefore, the Hibernate 3 jars must be included in the deployment. At the same time, due the presence of @PersistenceUnit or @PersistenceContext annotations on the application classes, the application server will automatically add the 'org.hibernate' module as a dependency.

This can be avoided by instructing the server to exclude the module from the deployment's list of dependencies.

最后,与您的应用程序捆绑在一起的JPA库必须是版本3.x。