0

我正在尝试使用 MySQL 后端创建一个简单的 Web 应用程序。我能够在 Geronimo 中部署我的 .ear。但是,当我通过 OpenJPA 提交表单以将一些内容保存到数据库时,我收到以下错误(下面是我的堆栈跟踪):

原因:org.apache.openjpa.persistence.ArgumentException:必须在 ConnectionDriverName 属性中指定 JDBC 驱动程序或数据源类名称。

我的项目是一个企业应用程序项目 (AReyes),带有一个 Web 模块 (AReyesAdminWeb) 和一个 ejb 模块 (AReyesEJB)。

我的persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
    <persistence-unit name="AReyesPersistUnit" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>AReyesMySql</jta-data-source>
        <class>com.areyes.entity.Admin</class>
        <properties>
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
        </properties>
    </persistence-unit>
</persistence>

该文件位于 AReyesEJB/ejbModule/META-INF

我正在使用什么

  • 带有 Tomcat 6 的 Geronimo 2.2.1
  • MySQL 5.5.11
  • OpenJPA 1.2.2
  • Eclipse Indego 发布
  • OS X 10.6.7

堆栈跟踪

Caused by: org.apache.openejb.OpenEJBException: Error while creating bean com.areyes.session.AdminManager: Error invoking constructor: public com.areyes.session.AdminManager()
    at org.apache.openejb.InjectionProcessor.construct(InjectionProcessor.java:120)
    at org.apache.openejb.InjectionProcessor.createInstance(InjectionProcessor.java:83)
    at org.apache.openejb.core.stateless.StatelessInstanceManager.ceateInstance(StatelessInstanceManager.java:204)
    at org.apache.openejb.core.stateless.StatelessInstanceManager.getInstance(StatelessInstanceManager.java:165)
    at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:165)
    at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
    at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
    at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282)
    ... 23 more
Caused by: org.apache.xbean.recipe.ConstructionException: Error invoking constructor: public com.areyes.session.AdminManager()
    at org.apache.xbean.recipe.ReflectionUtil$ConstructorFactory.create(ReflectionUtil.java:962)
    at org.apache.xbean.recipe.ObjectRecipe.internalCreate(ObjectRecipe.java:276)
    at org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:96)
    at org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:61)
    at org.apache.openejb.InjectionProcessor.construct(InjectionProcessor.java:118)
    ... 30 more
Caused by: <openjpa-1.2.2-r422266:898935 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
    at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:74)
    at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:784)
    at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:561)
    at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1344)
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:505)
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:430)
    at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:103)
    at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
    at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:863)
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:854)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:638)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:183)
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:192)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:145)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:56)
    at com.areyes.session.AdminManager.<init>(AdminManager.java:22)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.xbean.recipe.ReflectionUtil$ConstructorFactory.create(ReflectionUtil.java:952)
    ... 34 more

com.areyes.session.AdminManager 是一个@Stateless bean,它已被注入 AReyesAdminWeb 中的一个 servlet(带有@EJB anno)。这是构造函数:

@Stateless
public class AdminManager implements AdminService {
    private EntityManagerFactory fac;
    private EntityManager em;

    public AdminManager () {
        fac = Persistence.createEntityManagerFactory("AReyesPersistUnit", System.getProperties());
        em = fac.createEntityManager();
    }

这种行为似乎我的 Web 应用程序不知道我的 ejb 应用程序中的 persistence.xml。我想知道我是否正确地捆绑了所有东西。

我将此添加到我的 application.xml 中:

  <module>
    <connector>tranql-connector-mysql-local-1.5.rar</connector>
  </module>

然后我将它添加到我的 geronimo-application.xml 中:

<app:module>
    <app:connector>tranql-connector-mysql-local-1.5.rar</app:connector>
    <app:alt-dd>mysql-plan.xml</app:alt-dd>
</app:module>

在我的 EA 项目 (AReyes) 中,我在 META-INF 所在的文件夹中添加了 mysql-plan.xml。然后我从我的 Geronimo 文件夹中导入了 tranql-connector-mysql-local-1.5.rar。

4

1 回答 1

0

听起来 Web 应用程序在其类路径上找不到 persistence.xml。通过阅读此线程,您可能会遇到同样的问题。尝试将 persistence.xml 移动到以下位置,看看你的进展如何......

WEB-INF/classes/META-INF/persistence.xml
于 2011-06-23T21:54:40.603 回答