没有持久性提供我的AppEngine上后端的EntityManager [英] No persistence provider for my EntityManager in appengine backend

查看:427
本文介绍了没有持久性提供我的AppEngine上后端的EntityManager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的Andr​​oid Studio和我创建使用Android Studio提供的工具,应用程序引擎的后端。我试图使用JPA /持续性在我的后端模块为我的Andr​​oid应用程序。
当我尝试我的API来存储一些数据,我得到的异常

  java.lang.ExceptionInInitializerError
    在be.stece.esocomm.backendApp.EsoCommEndpoint.getEntityManager(EsoCommEndpoint.java:73)
....
javax.persistence.PersistenceException:由没有造成人员对EntityManager的持久性提供者命名esoCommBackendPersistence
    在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
    在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)

所以,问题与我的设置或项目结构的地方所在。既然找不到我的持久性提供者。但我不能找出问题的症结所在。

都在这个后端模​​块的我的build.gradle文件首先我有依赖条件:

 编译'的javax.servlet:servlet的API:2.5
  编译组:org.hibernate.javax.persistence',名称:'休眠-JPA-2.0-API,版本:1.0.0.Final
  编译org.hibernate作为:休眠-的EntityManager:4.1.7.Final

然后在MyModule中/ src目录/ META_INF / persistence.xml中我已经宣布的一切:

 <?XML版本=1.0编码=UTF-8&GT?;
<持久性的xmlns =htt​​p://java.sun.com/xml/ns/persistence版本=1.0>
  <持久性单位名称=esoCommBackendPersistence>
    <提供商GT; org.datanucleus.api.jpa.PersistenceProviderImpl< /提供商GT;
    <性状>
      <属性名=datanucleus.NontransactionalReadVALUE =真/>
      <属性名=datanucleus.NontransactionalWriteVALUE =真/>
      <属性名=datanucleus.ConnectionURLVALUE =应用引擎/>
      <属性名=datanucleus.appengine.datastoreEnableXGTransactions
        值=真/>
      <属性名=datanucleus.appengine.autoCreateDatastoreTxns
        值=真/>
    < /性状>
    <类别和GT; be.stece.esocomm.backendApp.NewsBean< /班>
  < /持久化部>
< /持久>

我不是100%肯定,如果persistence.xml中是在正确的目录。我试过几个选项,比如移动META_INF文件夹复制到/ src目录/主文件夹,而不是只/ src目录。但是,没有什么区别。

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

 公共类MyEntityManagerFactory {    私有静态最后弦乐PERSISTENCE_NAME =esoCommBackendPersistence;    私有静态最后的EntityManagerFactory emfInstance =
            Persistence.createEntityManagerFactory(PERSISTENCE_NAME);    私人MyEntityManagerFactory(){}    公共静态的EntityManagerFactory的get(){
        返回emfInstance;
    }} 私有静态的EntityManager getEntityManager(){
        返回MyEntityManagerFactory.get()createEntityManager()。 = GT;该错误是触发这一行
    }


解决方案

好了,我得到它的工作。

我删除了所有休眠和使用持久性的AppEngine按照尼尔·斯托克顿的建议。

  {相关性
  appengineSdk'com.google.appengine:AppEngine上-Java的SDK:1.8.9
  编译com.google.appengine:AppEngine上的端点:1.8.9
  编译com.google.appengine:AppEngine上的端点-DEPS:1.8.9
  编译'的javax.servlet:servlet的API:2.5    //持久性
    编译org.ow2.asm:ASM:4.0
    编译org.datanucleus:DataNucleus的-API JPA:3.1.3
    编译org.datanucleus:DataNucleus的-API JDO:3.1.3
    编译com.google.appengine.orm:DataNucleus的-AppEngine上:2.1.2
    编译org.datanucleus:DataNucleus的核心:3.1.3
    编译org.apache.geronimo.specs:Geronimo的jpa_2.0_spec:1.0
    编译javax.jdo:JDO-API:3.0.1
    编译javax.transaction的:JTA:1.1
}

另外现在我跟着以下指南创建端点:<一href=\"https://developers.google.com/appengine/docs/java/datastore/entities#Java_Kinds_and_identifiers\" rel=\"nofollow\">https://developers.google.com/appengine/docs/java/datastore/entities#Java_Kinds_and_identifiers

I'm using Android Studio and I've created an app engine backend with the tools provided by Android Studio. I'm trying to use JPA/Persistence in my backend module for my android application. When I try my API to store some data I get the Exception

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)

So the problem lies somewhere with my setup or project structure. Since it can't find my persistence provider. But I can't figure out where the problem lies.

First of all in my build.gradle file of this backend module I have the dependecies:

  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'

Then in MyModule/src/META_INF/persistence.xml I have declared everything:

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

I'm not 100% sure if the persistence.xml is in the right directory. I've tried several options, like moving the META_INF folder to the /src/main folder instead of just /src. But no difference.

To create my EntityManager I use the correct Persistence name

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
    }

解决方案

Ok, so I got it to work.

I removed all hibernate and use the appengine persistence as per suggestion of Neil Stockton.

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

Also now I followed the following guides to create the endpoints: https://developers.google.com/appengine/docs/java/datastore/entities#Java_Kinds_and_identifiers

这篇关于没有持久性提供我的AppEngine上后端的EntityManager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆