0

У меня есть приложение, в котором я сохранял все свои данные в Google Cloud SQL. Но теперь я думаю, что некоторые таблицы можно перенести в хранилище данных Google. Поэтому мой вопрос заключается в том, как использовать как хранилище данных, так и облачный SQL с использованием того же приложения. Я попытался проверить как опцию для хранилища данных, так и облачный SQL, но он остается только в Cloud SQL.Используйте Google Data Store и Google App Engine в одном приложении

Это мой файл 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 бобы:

Для Datastore:

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

Вот EMF боб для облачных SQL:

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

Вот сервлет для вставки компонента в хранилище данных:

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) 

я упускаю некоторые вещи. Пожалуйста, предложите.

+0

Где находится контейнер JavaEE в вашей среде? Это то, что для аннотации PersistenceContext. Вы не говорите, что вы пытались и что произошло, и что говорят различные журналы. Вы не указываете провайдера для одной единицы персистентности (так что JPA impl будет сохраняться в MySQL?). Какую версию JPA (1.0, 2.0, 2.1) вы используете для cloud-sql, а для AppEngine/Datastore? – DataNucleus

+0

у вас не может быть 2 единицы с сохранением с тем же именем – DataNucleus

+0

Я отредактировал вопрос. Пожалуйста, дайте свои ценные советы. – user2670364

ответ

1

У вас нет «провайдера», указанного для одного устройства с постоянством - какой поставщик JPA вы собираетесь использовать для cloud-sql? Поэтому укажите это.

У вас есть недействительный «поставщик» для другого устройства постоянной продолжительности. GAE JPA v2 является «org.datanucleus.api.jpa.PersistenceProviderImpl», как говорится в сообщении, но вы, похоже, хотите использовать какой-то (очень старый, неподдерживаемый) вариант GAE JPA 1. Убедитесь, что у вас есть правильный номер в CLASSPATH (а не другой)

Какая банкомат JPA API находится в CLASSPATH? (это НЕ реализация JPA). Если вы используете GAE JPA v2, вам нужен JPA API v2 (geronimo-jpa_2.0_spec) и НЕ JPA API v1 (geronimo-jpa_3.0_spec). Если одним из поставщиков JPA является JPA2, то другой должен быть слишком.

+0

Я упомянул поставщиков для обеих единиц сохранения (т. Е. 'Org.datanucleus.api.jpa.PersistenceProviderImpl'). Также добавлен 'geronimo-jpa_2.0_spec'. Тем не менее эта ошибка сохраняется: «ПРЕДУПРЕЖДЕНИЕ: в CLASSPATH текущего потока не найдено единицы измерения« транзакции - необязательно »! ПРЕДУПРЕЖДЕНИЕ: Ошибка для/componentinsert в '' Причина: javax.persistence.PersistenceException: не доступны поставщики непрерывности для «транзакций-необязательно» после проверки следующих обнаруженных реализаций: org.datanucleus.api.jpa.PersistenceProviderImpl – user2670364

+0

Что вы делаете думаю означает? Речь идет не только о добавлении вещей в CLASSPATH, но и об удалении дерьма, который вам не нужен ... как эта старая версия GAE JPA – DataNucleus

+0

Я удалил всю старую версию GAE JPA. – user2670364