【问题标题】:Can't find a persistence unit named in subdeployment "war" of deployment "ear"找不到在部署“ear”的子部署“战争”中命名的持久性单元
【发布时间】:2015-08-15 18:36:29
【问题描述】:

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

    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

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

     <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>

我在 META-INF 文件夹中的 war 项目中的 persistence.xml:

    <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-structure.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

【问题讨论】:

    标签: java spring hibernate maven


    【解决方案1】:

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

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

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

    如果这是真的,那么我建议尝试将休眠依赖项移动到 WAR 并查看它是否有效,或者在考虑类加载器层次结构的情况下重新组织您的 EAR/WAR :)

    【讨论】:

    • 感谢 maslan 对类加载的良好解释。但错误并没有消失。
    • 你试过我的建议了吗?比方说,将您的休眠依赖项转移到战争开始?
    • 是的,我删除了ear lib中的hibernate并更改了我的jboss-deployment-structure.xml,我应该发布我的部署结构吗?
    • 好吧,我们可以试试这个,或者你也可以把war和ear的结构放在一起,但只需告诉你的实体(用户)和你的hibernate类在ear war中的哪个目录。您确定 User 实体具有正确的包名称吗?
    • 我发布了我的 jboss-structure.xml 和我的用户文件。
    猜你喜欢
    • 2017-11-01
    • 2018-09-23
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多