[英]How to Deploy a Spring managed JPA application on JBoss 6.3 EAP
我有一個Java Web應用程序。 該應用程序使用JPA進行持久化。 持久性由Spring管理。 此應用程序可以輕松部署在Tomcat
,只需將war
文件放入webapps
。 但是幾天來,在JBoss
部署此應用程序成為我的噩夢。 我在此站點上找不到合適的帖子來解決問題,因此此帖子不存在。
首先,您需要配置一個數據源(我使用了mysql數據庫)。 我的JBoss安裝在C:\\jboss-eap-6.3\\
並且使用Windows操作系統。 步驟:1.在C:\\jboss-eap-6.3\\modules
下創建目錄結構com\\mysql\\main
。 您將最終得到C:\\jboss-eap-6.3\\modules\\com\\mysql\\main
目錄結構。 2.在此main
目錄中創建一個xml
文件module.xml
。 另外,將mysql
驅動程序jar mysql-connector-java-5.1.23-bin.jar
放在同一目錄中。 最后,您將在C:\\jboss-eap-6.3\\modules\\com\\mysql\\main
擁有module.xml
和mysql-connector-java-5.1.23-bin.jar
。 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">
。 在drivers
元素下面添加xml
片段。
<driver name="mysqlDriver" module="com.mysql">
<xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
</driver>
在datasources
元素下面添加xml
片段:
<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.xml
和applicationContext.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
,您需要告訴spring persistence.xml
的位置。 以下文獻摘自
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-deployment-structure.xml最后,您需要在WEB-INF
下創建jboss-deployment-structure.xml
。 該文件的內容應為:
<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版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.