【问题标题】:Persistance in JBoss wildfly (in a spring application)JBoss wildfly 中的持久性(在 spring 应用程序中)
【发布时间】:2014-01-07 20:38:09
【问题描述】:

我有一个 spring 3.2 应用程序,它使用以下配置定义了持久性:

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="MYSQL"/>
    <property name="showSql" value="false"/>
    <property name="generateDdl" value="false"/>
    <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
</bean>

<util:map id="jpaPropertyMap">
        <entry key="hibernate.hbm2ddl.auto" value="update"/>
        <entry key="hibernate.cache.use_query_cache" value="true" />
        <entry key="hibernate.max_fetch_depth" value="4" />
        <entry key="hibernate.show_sql" value="false" />
        <entry key="hibernate.format_sql" value="false" />
        <entry key="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
        <entry key="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory" />
        <entry key="hibernate.connection.autocommit" value="false" />
</util:map>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>      
        <property name="jtaDataSource" ref="dataSource"  />
        <property name="jpaPropertyMap" ref="jpaPropertyMap" />
        <property name="persistenceUnitManager" ref="persistenceUnitManager" />
</bean>

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager" >
        <property name="packagesToScan"  value="gr.hcg.nautologhsh.domain" />
        <property name="defaultJtaDataSource" ref="dataSource" />
</bean>

我的实体类存在于 gr.hcg.nautologhsh.domain 包下。我没有使用任何persistance.xml 文件。

现在,这个配置在 JBoss 8 wildfly 中运行良好。但是,当我看到 JBoss 的管理控制台时,在标签 JPA 中,我没有看到任何持久性单元。

通过一些谷歌搜索,我认为持久性单元必须通过 JBoss 而不是通过 Spring 配置才能在那里可见 - 这是真的吗?我真的不明白为什么 JBoss 中可能有不同的 PU - 它们如何使用? JBoss 的文档在该主题上非常简陋,我无法理解很多东西:(

有人可以向我解释如何定义 JBoss 持久性单元并在 Wildfly 管理控制台的 JPA 标记中显示它们吗?

更新

我创建了一个包含以下内容的 persistence.xml:

<persistence 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"
             version="2.0">

    <persistence-unit name="nautologhshPU" transaction-type="JTA">

        <jta-data-source>java:jboss/datasources/nautologhsh</jta-data-source>

    </persistence-unit>
</persistence>

改变了我的datasource-config.xml bean 之类的:

<jee:jndi-lookup  id="dataSource" jndi-name="java:jboss/datasources/nautologhsh" resource-ref="false" />

<tx:jta-transaction-manager  />

<jee:jndi-lookup jndi-name="java:comp/env/jpa/EntityManager" id="entityManager" expected-type="javax.persistence.EntityManager" />

并将以下内容添加到web.xml

<persistence-context-ref>
    <persistence-context-ref-name>jpa/EntityManager</persistence-context-ref-name>
    <persistence-unit-name>nautologhshPU</persistence-unit-name>
</persistence-context-ref>

现在得到以下错误:

20:24:41,839 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 52) MSC000001: Failed to start service jboss.persistenceunit."Nautologhsh.war#nautologhshPU": org.jboss.msc.service.StartException in service jboss.persistenceunit."Nautologhsh.war#nautologhshPU": org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.classloading.spi.ClassLoaderService]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:169) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1]
        at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.7.0_45]
        at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:463) [wildfly-security-manager-1.0.0.Beta3.jar:1.0.0.Beta3]
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:178) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
        at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
        at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.1.Final.jar:2.1.1.Final]
Caused by: org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.classloading.spi.ClassLoaderService]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:127)
        at org.hibernate.envers.event.EnversIntegrator.integrate(EnversIntegrator.java:65)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1837)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:854)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:847)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:396)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:846)
        at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:151) [wildfly-jpa-8.0.0.Beta1.jar:8.0.0.Beta1]
        ... 8 more

20:24:41,861 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "Nautologhsh.war")]) - failure description: {"JBAS014671: Failed services" => {"jboss.persistenceunit.\"Nautologhsh.war#nautologhshPU\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"Nautologhsh.war#nautologhshPU\": org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.classloading.spi.ClassLoaderService]
    Caused by: org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.classloading.spi.ClassLoaderService]"}}

有人知道org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.classloading.spi.ClassLoaderService] 是什么吗??

【问题讨论】:

  • 看起来您使用的是wildfly 8.0.0.Beta1,但beta2 已经有几个星期了。你可以试试这个吗?
  • 好的,我会再次更新 - 谢谢!
  • 您好 - 您确定有 Beta 2 吗?我在这里找不到:wildfly.org/downloads :(
  • 对不起,我的错,它还没有发布。我从我的机器上的源代码构建,因此我的错误。
  • 没问题 - 但是我仍然看到更新中描述的错误:(

标签: spring jpa persistence jboss7.x wildfly


【解决方案1】:

您可以查看此快速入门示例:https://github.com/sgilda/wildfly-quickstart/blob/master/greeter-spring 使用 META-INF/persistence.xml 文件,其中 Spring 配置使用查找从 Wildfly 检索 EntityManager 和数据源:

<!-- Look up the database in JNDI -->
<jee:jndi-lookup jndi-name="java:jboss/datasources/ExampleDS" id="dataSource"
  expected-type="javax.sql.DataSource" />

<!-- Look up the container deployed EntityManager -->
<jee:jndi-lookup jndi-name="java:comp/env/hello/EntityManager"
  id="entityManager" expected-type="javax.persistence.EntityManager" />

(https://github.com/sgilda/wildfly-quickstart/blob/master/greeter-spring/src/main/webapp/WEB-INF/spring-business-context.xml)

【讨论】:

  • 这是一个很好的例子!我看到有一个部署了 EntityManager 的容器,带有 jndi-name="java:comp/env/hello/EntityManager"。但是我不能真正理解 where 这个 EntityManager 是定义的吗?我的意思是我们怎么知道我们的实体管理器有这个 jndi 名称 (hello/EntityManager)?
  • EntityManager 由 Wildfly 自己提供(Hibernate 已经自带)。所以你只需要在你的 Spring bean 中使用注入它,但初始化它不是你的 Spring 应用程序的职责;-)
  • 是的,我明白了——我没有得到的是你怎么知道 EntityManager 的 JNDI 名称实际上是 hello/EntityManager ?
  • 对不起,我看错了你的问题。实际上好点:绑定在 web.xml 部署描述符中声明:&lt;persistence-context-ref&gt; &lt;persistence-context-ref-name&gt;hello/EntityManager&lt;/persistence-context-ref-name&gt; &lt;persistence-unit-name&gt;helloPU&lt;/persistence-unit-name&gt; &lt;/persistence-context-ref&gt;
  • 你能看看我更新的问题吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2016-12-25
  • 2016-09-24
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多