【问题标题】:Use Google Data Store and Google App Engine in same application在同一应用程序中使用 Google Data Store 和 Google App Engine
【发布时间】:2013-08-10 11:55:45
【问题描述】:

我有一个应用程序,我将所有数据存储在 Google Cloud SQL 中。但现在我认为一些表可以移动到谷歌数据存储区。所以我的问题是如何使用相同的应用程序同时使用 Data Store 和 Cloud SQL。我尝试检查 datastore 和 cloud SQL 的选项,但它只保留在 Cloud SQL 中。

这是我的 persistence.xml 文件。

<?xml version="1.0" encoding="UTF-8" ?>
<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_1_0.xsd"
    version="1.0">

    <persistence-unit name="transactions-optional1">
        <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
        <class>com.sample.poc.Component</class>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
            <property name="datanucleus.singletonEMFForName" value="true"/>
        </properties>

    </persistence-unit>


    <persistence-unit name="transactions-optional2"
        transaction-type="RESOURCE_LOCAL">
        <provider> org.datanucleus.jpa.PersistenceProviderImpl</provider>
        <class>com.sample.poc.User</class>
        <class>com.sample.poc.Role</class>

        <properties>
          <property name="javax.persistence.jdbc.driver"
                value="com.google.appengine.api.rdbms.AppEngineDriver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:google:rdbms://span-test-app:testinstance/pocDB" />
            <property name="javax.persistence.jdbc.user" value="" />
            <property name="javax.persistence.jdbc.password" value="" />
        </properties>

    </persistence-unit>

</persistence>

这是我的两个 EMF bean:

对于数据存储:

package com.sample.poc;


import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public final class EMFDS {
    private static final EntityManagerFactory emfInstance = Persistence
            .createEntityManagerFactory("transactions-optional1");

    private EMFDS() {
    }

    public static EntityManagerFactory get() {
        return emfInstance;
    }
}

这里是云 sql 的 EMF bean:

package com.sample.poc;


import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public final class EMFRDBMS {
    private static final EntityManagerFactory emfInstance = Persistence
            .createEntityManagerFactory("transactions-optional");

    private EMFRDBMS() {
    }

    public static EntityManagerFactory get() {
        return emfInstance;
    }
}

这是在数据存储区中插入组件的 servlet:

package com.sample.poc;

import java.io.IOException;

import javax.persistence.EntityManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ComponentInsert extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String CompId = request.getParameter("CompId");  
    String CompName= request.getParameter("CompName");  
    response.setContentType("text/html");  
    EntityManager e = EMFDS.get().createEntityManager();
    try {
        e.getTransaction().begin();
        Component ob = new Component();
        ob.setCompId(Integer.parseInt(CompId));
        ob.setCompName(CompName);
        e.persist(ob);
        e.getTransaction().commit();
    } catch (Exception ex) {
        e.getTransaction().rollback();
        ex.printStackTrace();
    }
}

}

我只想将用户、角色 bean 持久化在云 sql 和数据存储中的组件中。

当我尝试在数据存储中插入一个组件时,它会抛出这个异常:

Caused by: javax.persistence.PersistenceException: No persistence providers available for "transactions-optional1" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:180)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:70)
    at com.sample.poc.EMFDS.<clinit>(EMFDS.java:9)
    ... 40 more
12 Aug, 2013 9:48:24 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Nested in java.lang.ExceptionInInitializerError:
javax.persistence.PersistenceException: No persistence providers available for "transactions-optional1" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:180)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:70)

我错过了什么吗?请提出建议。

【问题讨论】:

  • 您的环境中的 JavaEE 容器在哪里?这就是 PersistenceContext 注释的用途。你没有说你尝试了什么,发生了什么,以及各种日志说了什么。您没有为一个持久性单元指定提供者(那么哪个 JPA impl 将持久化到 MySQL?)。您将哪个版本的 JPA(1.0、2.0、2.1)用于 cloud-sql,哪个版本用于 AppEngine/Datastore?
  • 你不能有 2 个同名的持久化单元
  • 我已经编辑了这个问题。请提出您宝贵的建议。

标签: java google-app-engine jpa google-cloud-datastore google-cloud-sql


【解决方案1】:

您没有为一个持久性单元指定“提供者” - 您将为 cloud-sql 使用哪个 JPA 提供者?所以指定它。

您的另一个持久性单元的“提供者”无效。如消息所述,GAE JPA v2 是“org.datanucleus.api.jpa.PersistenceProviderImpl”,但您似乎想使用一些(非常旧的、不受支持的)GAE JPA 1 变体。确保您在 CLASSPATH 中有正确的一个(而不是另一个)

CLASSPATH 中有哪个“JPA API”jar? (这不是 JPA 实现)。如果您使用的是 GAE JPA v2,那么您需要 JPA API v2 (geronimo-jpa_2.0_spec) 而不是 JPA API v1 (geronimo-jpa_3.0_spec)。如果使用的 JPA 提供程序之一是 JPA2,那么另一个也必须是。

【讨论】:

  • 我已经提到了两个持久性单元的提供者(即org.datanucleus.api.jpa.PersistenceProviderImpl)。还添加了 geronimo-jpa_2.0_spec 。这个错误仍然存​​在:WARNING: No persistence unit of name "transactions-optional" is found in the CLASSPATH of the current thread! WARNING: Error for /componentinsert at `Caused by: javax.persistence.PersistenceException:在尝试以下发现的实现后,没有可用于“事务可选”的持久性提供程序:org.datanucleus.api.jpa.PersistenceProviderImpl
  • 你认为 是什么意思?这不仅仅是向 CLASSPATH 中添加东西,而是删除你不需要的废话......就像那个旧版本的 GAE JPA
  • 我已经删除了所有旧版本的 GAE JPA 。
  • 所以用persistence.xml 现在的样子更新你的“问题”,以及CLASSPATH是什么。
  • 更新了 persistence.xml 。
猜你喜欢
  • 1970-01-01
  • 2020-07-26
  • 2014-08-23
  • 1970-01-01
  • 2010-09-07
  • 2010-12-23
  • 2013-02-05
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多