java - 找不到部署 "war"的子部署 "ear"中命名的持久性单元

标签 java spring hibernate maven

我在一个ear项目中使用Wildfly与Spring 4.1.6和Hibernate 4.3.2,但我得到了这个异常:

    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.subunit."ear.ear"."ear.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."ear.ear"."ear.war".POST_MODULE: JBAS018733: Failed to process phase POST_MODULE of subdeployment "ear.war" of deployment "ear.ear"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:166) [wildfly-server-8.2.0.Final.jar:8.2.0.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
     Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011440: Can't find a persistence unit named org.hibernate.tutorial.jpa in subdeployment "ear.war" of deployment "ear.ear"
at org.jboss.as.jpa.processor.PersistenceRefProcessor.getPersistenceUnitBindingSource(PersistenceRefProcessor.java:212)
at org.jboss.as.jpa.processor.PersistenceRefProcessor.getPersistenceUnitRefs(PersistenceRefProcessor.java:127)
at org.jboss.as.jpa.processor.PersistenceRefProcessor.processDescriptorEntries(PersistenceRefProcessor.java:78)
at org.jboss.as.ee.component.deployers.AbstractDeploymentDescriptorBindingsProcessor.deploy(AbstractDeploymentDescriptorBindingsProcessor.java:95)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:159) [wildfly-server-8.2.0.Final.jar:8.2.0.Final]
... 5 more

ear 项目中的 persistence.xml 位于 META-INF 文件夹中:

     <persistence-unit name="ear" transaction-type="JTA">
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jboss/jpaDS</jta-data-source>
    <jar-file>Jar/ear_jar.jar</jar-file>
    <properties>
        <property name="hibernate.current_session_context_class" value="jta"/>
        <property name="hibernate.id.new_generator_mappings" value="true"/>
        <property name="hibernate.dialect"      value="org.hibernate.dialect.Dialect"/>
        <property name="hibernate.show_sql"     value="true"/>
        <property name="hibernate.format_sql"   value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>               
    </properties>
    </persistence-unit>
    </persistence>

war 项目中的 persistence.xml 位于 META-INF 文件夹中:

    <persistence-unit name="org.hibernate.tutorial.jpa" transaction-type="JTA"> 
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>jboss/jpaDS</jta-data-source> 
      <class>main.java.com.model.User</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
      <properties>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value="C:\Users\alexandra\MyDB;create=true"/>
        <property name="javax.persistence.jdbc.user" value="user"/>
        <property name="javax.persistence.jdbc.password" value="password"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.connection.release_mode" value="after_statement"/>
        <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory"/>  
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup" />
        <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/> 
        <property name="connection.pool_size" value="1"/>
        <property name="current_session_context_class" value="thread"/>
        <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        <property name="show_sql" value="true"/>
        <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
        <property name="hibernate.current_session_context_class" value="thread"/>
        <property name="jboss.as.jpa.managed" value="false"/>
        <property name="javax.persistence.validation.mode" value="none"/>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
        <property name="hibernate.current_session_context_class" value="jta"/>
      </properties>
     </persistence-unit>
    </persistence>

编辑:

我的jboss-deployment-struct.xml之耳:

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
      <deployment>
       <dependencies>
        <module name="deployment.Ear.ear.ear_jar.jar" export="true" />
       </dependencies>
      </deployment>

     <sub-deployment name="War/ear.war" >
      <resources>
       <resource-root path="War/ear.war"/>
     </resources>
     <local-last value="true" />
   </sub-deployment>

    <sub-deployment name="Jar/ear_jar.jar" >
      <resources>
        <resource-root path="Ear/ear_jar.jar" />
      </resources>

   </sub-deployment>

  </jboss-deployment-structure>

我的用户文件:

     import javax.persistence.Column;
     import javax.persistence.Entity;
     import javax.persistence.GeneratedValue;
     import javax.persistence.GenerationType;
     import javax.persistence.Id;
     import org.springframework.context.annotation.Bean;
     import org.springframework.format.annotation.NumberFormat;
     import org.springframework.format.annotation.NumberFormat.Style;
     import org.springframework.stereotype.Repository;

     @Entity(name = "REGISTRY.register")  
     @Repository
     public class User implements Serializable {

    public static final long serialVersionUID = 1L;
    @Column(name = "name",insertable = false)
    private String name;
    @Column(name = "password",insertable = false)
    private String password;
    @Id
    @NumberFormat(style = Style.NUMBER) 
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int ID;
    // getters and setters

最佳答案

这非常简单(至少我希望如此;))。 有一个类加载器层次结构,因此层次结构中“上方”的类加载器无法加载层次结构中较低的对象,但是较低的类加载器可以加载其上方的对象。

即。 EAR 类加载器位于 WAR 类加载器之上。因此,在 EAR 中加载的类无法从 WAR 中加载对象。但 WAR 对象可以从 EAR 加载对象。

我想,既然您在 EAR 中获得了 persistence.xml,您也将 hibernate 依赖项放入了 EAR 中,因此它们无法从 WAR 加载对象。

如果这是真的,那么我建议尝试将 hibernate 依赖项移至 WAR 并查看它是否有效,或者使用类加载器层次结构重新组织您的 EAR/WAR :)

关于java - 找不到部署 "war"的子部署 "ear"中命名的持久性单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30588114/

相关文章:

java - 编程以捕获数组中的输入

java - java switch 中的多个参数

java - 外部化配置不适用于 Scala 的 Map

jquery - 如何使用 EL 将 AJAX 返回的列表设置为页面上的列表引用

java - 无法提交 JPA 事务;嵌套异常 - 事务标记为 rollbackOnly

Java 控制台输出 - 文件和控制台两者

java - "Missing request header "生产环境中的 Spring 引导 Controller 异常,而不是在本地服务器上

java - 使用@Autowired环境读取属性文件 spring java 空指针异常

java - 如何将具有共享主键的数据库模式转换为 hibernate ?

java - JPA Criteria Query - 如何在两个表上实现联接以在单个查询中获得所需的结果