【问题标题】:Spring JPA configuration issueSpring JPA 配置问题
【发布时间】:2015-11-19 15:18:50
【问题描述】:

我已经阅读了这里几乎所有关于 Spring JPA 配置的帖子。基本上我想在我的项目中实现 JPA 分页,为此我需要 Spring JPA 支持。但是当我在我的项目中包含spring-data-jpa.jar 时,我得到了以下异常。

Caused by: java.lang.IllegalArgumentException: JBAS011470: Persistence unitName was not specified and there are 2 persistence unit definitions in application deployment deployment "CPCardApp.ear".  Either change the application deployment to have only one persistence unit definition or specify the unitName for each reference to a persistence unit.
    at org.jboss.as.jpa.container.PersistenceUnitSearch.ambiguousPUError(PersistenceUnitSearch.java:172)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.findWithinDeployment(PersistenceUnitSearch.java:152)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.findWithinApplication(PersistenceUnitSearch.java:86)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.findPersistenceUnitSupplier(PersistenceUnitSearch.java:76)
    at org.jboss.as.jpa.container.PersistenceUnitSearch.resolvePersistenceUnitSupplier(PersistenceUnitSearch.java:63)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.getPersistenceUnit(JPAAnnotationParseProcessor.java:357)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.getBindingSource(JPAAnnotationParseProcessor.java:288)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.processMethod(JPAAnnotationParseProcessor.java:201)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.processPersistenceAnnotations(JPAAnnotationParseProcessor.java:138)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.deploy(JPAAnnotationParseProcessor.java:95)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:116) [jboss-as-server-7.1.3.Final-redhat-4.jar:7.1.3.Final-redhat-4]
    ... 5 more

persistence.xml(注意:我的 xml 中有 2 个持久性单元,而 Spring 不支持)

<?xml version="1.0" encoding="UTF-8"?>
<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="data01">
        <jta-data-source>java:/MySqlDataDS</jta-data-source>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.cache.use_second_level_cache"
                value="false" />
            <property name="hibernate.id.new_generator_mappings" value="false" />
        </properties>
    </persistence-unit>
    <persistence-unit name="cpaudit">
        <jta-data-source>java:/MySqlAuditDS</jta-data-source>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.cache.use_second_level_cache"
                value="false" />
            <property name="hibernate.id.new_generator_mappings" value="false" />
        </properties>
    </persistence-unit>
</persistence>

【问题讨论】:

  • 错误信息似乎很清楚。它的哪一部分让你感到困惑?
  • 什么应用服务器?
  • @JustinKSU 这是提到的 Jboss at org.jboss
  • 这个答案会对你有所帮助:stackoverflow.com/questions/14522478/…

标签: spring hibernate jpa


【解决方案1】:

您可以拥有 2 个持久性单元。您的配置存在问题(使用 JBoss + Spring + JPA (Hibernate) + JTA 的组合)。正确的配置取决于您的 JBoss 和 Spring 版本。 无论您需要什么,都需要一个 xml 文件来使用两个实体管理器来定义您的 JPA 配置。

在 application-jpa-config.xml 中尝试这样的事情:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:transaction="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    <beans>
        <bean id="entityManagerFactorData01" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="jpaProperties">
                <map>
                    <entry key="hibernate.cache.use_second_level_cache" value="false"/>
                    <entry key="hibernate.id.new_generator_mappings" value="false"/>
                    <entry key="hibernate.transaction.jta.platform" value-ref="jtaPlatform"/>
                </map>
            </property>
            <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
            <property name="jtaDataSource">
                <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                    <property name="driverClassName" value="${database.driver}"/>
                    <property name="password" value="${database.data01.password}"/>
                    <property name="url" value="${database.data01.url}"/>
                    <property name="username" value="${database.data01.user}"/>
                </bean>
            </property>
            <property name="packagesToScan" value="com.app.entites.data01"/>
        </bean>

        <bean id="entityManagerFactoryCpaudit"
              class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="jpaProperties">
                <map>
                    <entry key="hibernate.cache.use_second_level_cache" value="false"/>
                    <entry key="hibernate.id.new_generator_mappings" value="false"/>
                    <entry key="hibernate.transaction.jta.platform" value-ref="jtaPlatform"/>
                </map>
            </property>
            <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
            <property name="jtaDataSource">
                <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                    <property name="driverClassName" value="${database.driver}"/>
                    <property name="password" value="${database.cpaudit.password}"/>
                    <property name="url" value="${database.cpaudit.url}"/>
                    <property name="username" value="${database.cpaudit.user}"/>
                </bean>
            </property>
            <property name="packagesToScan" value="com.app.entites.cpaudit"/>
        </bean>

        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" id="jpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
        </bean>

        <context:annotation-config/>

        <jpa:repositories base-package="com.app.repo.data01" entity-manager-factory-ref="entityManagerFactorData01"/>
        <jpa:repositories base-package="com.app.repo.cpaudit" entity-manager-factory-ref="entityManagerFactoryCpaudit"/>


        <!-- ************ JpaTransactionManager *********** -->
        <!--
            This will depend on your JBoss and Spring version and your application.
            You will need to work this out.
            Getting your transactionManager correct could be difficult.
            See the following project for more ideas:
            https://github.com/manish-in-java/spring-data-jta/blob/master/src/main/resources/springContext.xml
        -->
        <transaction:annotation-driven/>

        <bean class="java.lang.String" id="jtaPlatform">
            <constructor-arg value="org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform"/>
        </bean>

        <bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager">
            <property name="transactionManager">
                <bean class="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/>
            </property>
            <property name="userTransaction">
                <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction"/>
            </property>
        </bean>
        <!-- ************ JpaTransactionManager *********** -->

    </beans>
</beans>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多