【问题标题】:Exception when injecting EntityManager with TomEE使用 TomEE 注入 EntityManager 时出现异常
【发布时间】:2015-10-31 21:59:58
【问题描述】:

我正在尝试使用 Java EE 创建一个简单的项目。但是,我得到了一个巨大的堆栈跟踪。

org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=BarSystem_war_exploded)
at org.apache.openejb.config.ReportValidationResults.deploy(ReportValidationResults.java:88)
at org.apache.openejb.config.AppInfoBuilder.build(AppInfoBuilder.java:312)
at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:974)
at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1227)
at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1100)
at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5416)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWar(TomcatWebAppBuilder.java:663)
at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps(TomcatWebAppBuilder.java:622)
at org.apache.tomee.catalina.deployment.TomcatWebappDeployer.deploy(TomcatWebappDeployer.java:43)
at org.apache.openejb.assembler.DeployerEjb.deploy(DeployerEjb.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
at org.apache.openejb.security.internal.InternalSecurityInterceptor.invoke(InternalSecurityInterceptor.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:181)
at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:100)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85)
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:227)
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:194)
at org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:370)
at org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:181)

所以我有一个像这样的 UserDAO:

@Stateless
public class UserDAO {

@PersistenceContext
private EntityManager em;

public void createUser(String name) {
//        User user = new User();
//        user.setName(name);
//        em.persist(user);
//        System.out.println("Maliiii");
    }
}

当我评论 EntityManager 和 @PersistenceContext 时,TomEE 会毫无例外地运行。但是,只有通过删除 cmets 和部署,我才能得到一个巨大的堆栈跟踪。在我切换到 TomEE 之前,我尝试了 glassfish,但没有出现这个问题。但是,在应用程序管理器中设置 jdbc 连接池时出现问题,所以我切换到了 tomee。

persistence.xml:

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

<persistence-unit name="NewPersistenceUnit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/bar"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <!--<property name="hibernate.archive.autodetection" value="class"/>-->
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hbm2ddl.auto" value="create"/>
    </properties>
</persistence-unit>

有什么办法解决吗?

【问题讨论】:

  • 省略 unitName 属性是特定于供应商的,请尝试以这种方式注入 @PersistenceContext(name = "NewPersistenceUnit")。
  • 我试过了,在persistence.xml中也加了名字,但是没有用:(
  • 这是整个堆栈跟踪吗?日志中没有更多内容?
  • stackoverflow 没有让我全部发布,我不得不删掉 :(

标签: java jakarta-ee jpa ejb apache-tomee


【解决方案1】:

首先想到的是 TomEE 的标准安装具有 JPA 的 OpenJPA 实现,而不是休眠与 .如果是这种情况,请尝试从persistence.xml 中删除&lt;provider&gt;。有一个带有 Eclipselink 的 TomEE 版本(称为 Plume),但没有带有 hibernate 的官方版本。如果你想要休眠,你可以将它作为依赖包含在你的 WAR 中。

但是,glassfish 也不包含休眠功能,所以您的 WAR 中可能已经有休眠功能?

【讨论】:

  • 你好,我试过用maven。在 pom 文件中我有:hibernate-jpa-2.1-api, hibernate-entitymanager, hibernate-core.
  • 那么看来我的回答不适用。您在 TomEE 中安装了 MySQL jdbc 驱动程序吗?否则我没有想法 - 尝试搜索有关如何使用休眠而不是内置 OpenJPA 的 TomEE 文档,可能需要做一些事情。你能发布剩下的stackrace吗?我想知道是否还有其他嵌套异常,因为最上面的异常来自 EJB,而不是来自 JPA,并且没有任何有用的消息。
【解决方案2】:
  • 正如@OndrejM 所说,tomcat 使用 apache open jpa 作为 JPA 实现,因此您可以将提供程序更改为

    org.apache.openjpa.persistence.PersistenceProviderImpl

指定持久化提供者实现

您还需要更改 JDBC 配置属性名称以使用 OpneJpa 而不是 hibernate

**

<property name="openjpa.ConnectionDriverName"value="your value" />
<property name="openjpa.ConnectionURL" value="your value" />
<property name="openjpa.ConnectionUserName" value="your value" />
<property name="openjpa.ConnectionPassword" value="your value" />

**

【讨论】:

    【解决方案3】:

    所以我发现了错误,这确实是一个愚蠢的错误。 由于我使用的是 InteliJ,因此我正在从 ide 查询“用户”表。我也确实从 mysql 查询过,但没有注意到变化。事实证明,jpa 创建了一个“Users”和“USERS”表(我尝试更改@Entity 中的名称)并且它一直在写入这两个表。所以我在刷新 MySql 工作台中的“表”后注意到了这些表。感谢大家的帮助,我很抱歉这个愚蠢的问题:)

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2014-11-19
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多