在appengine后端没有我的EntityManager的持久性提供程序

时间:2014-06-21 10:15:08

标签: google-app-engine jpa android-studio persistence entitymanager

我使用的是Android Studio,并且我已经使用Android Studio提供的工具创建了应用引擎后端。我试图在我的后端模块中使用JPA / Persistence来安装我的Android应用程序。 当我尝试使用API​​存储一些数据时,我得到了异常

java.lang.ExceptionInInitializerError
    at be.stece.esocomm.backendApp.EsoCommEndpoint.getEntityManager(EsoCommEndpoint.java:73)
....
Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named esoCommBackendPersistence
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)

所以问题出在我的设置或项目结构上。因为它无法找到我的持久性提供者。但我无法弄清问题所在。

首先,在我的后端模块的build.gradle文件中,我有所依赖:

  compile 'javax.servlet:servlet-api:2.5'
  compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.0-api', version: '1.0.0.Final'
  compile 'org.hibernate:hibernate-entitymanager:4.1.7.Final'

然后在MyModule / src / META_INF / persistence.xml中我宣布了所有内容:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
  <persistence-unit name="esoCommBackendPersistence">
    <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
    <properties>
      <property name="datanucleus.NontransactionalRead" value="true" />
      <property name="datanucleus.NontransactionalWrite" value="true" />
      <property name="datanucleus.ConnectionURL" value="appengine" />
      <property name="datanucleus.appengine.datastoreEnableXGTransactions"
        value="true" />
      <property name="datanucleus.appengine.autoCreateDatastoreTxns"
        value="true" />
    </properties>
    <class>be.stece.esocomm.backendApp.NewsBean</class>
  </persistence-unit>
</persistence>

我不能100%确定persistence.xml是否在正确的目录中。我已经尝试了几个选项,比如将META_INF文件夹移动到/ src / main文件夹而不是/ src。但没有区别。

要创建我的EntityManager,我使用正确的持久性名称

public class MyEntityManagerFactory {

    private static final String PERSISTENCE_NAME = "esoCommBackendPersistence";

    private static final EntityManagerFactory emfInstance =
            Persistence.createEntityManagerFactory(PERSISTENCE_NAME);

    private MyEntityManagerFactory() {}

    public static EntityManagerFactory get() {
        return emfInstance;
    }

}

 private static EntityManager getEntityManager() {
        return MyEntityManagerFactory.get().createEntityManager(); => The error is triggered on this line
    }

1 个答案:

答案 0 :(得分:1)

好的,我开始工作了。

我根据Neil Stockton的建议删除了所有的休眠并使用了appengine持久性。

dependencies {
  appengineSdk 'com.google.appengine:appengine-java-sdk:1.8.9'
  compile 'com.google.appengine:appengine-endpoints:1.8.9'
  compile 'com.google.appengine:appengine-endpoints-deps:1.8.9'
  compile 'javax.servlet:servlet-api:2.5'

    // Persistence
    compile 'org.ow2.asm:asm:4.0'
    compile 'org.datanucleus:datanucleus-api-jpa:3.1.3'
    compile 'org.datanucleus:datanucleus-api-jdo:3.1.3'
    compile 'com.google.appengine.orm:datanucleus-appengine:2.1.2'
    compile 'org.datanucleus:datanucleus-core:3.1.3'
    compile 'org.apache.geronimo.specs:geronimo-jpa_2.0_spec:1.0'
    compile 'javax.jdo:jdo-api:3.0.1'
    compile 'javax.transaction:jta:1.1'
}

现在我还按照以下指南创建了端点:https://developers.google.com/appengine/docs/java/datastore/entities#Java_Kinds_and_identifiers