Как отредактировать jdoconfig.xml и persistence.xml, чтобы JPA сохранял данные в хранилище данных appengine

Используя плагин Google Eclipse, мой проект автоматически поставляется с двумя файлами в папке META-INF: jdoconfig.xml и persistence.xml. Согласно инструкциям на странице https://developers.google.com/appengine/docs/java/datastore/jpa/overview, в моем файле сохраняемости должна быть следующая строка для хранилища данных jpa:

<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>

Но когда я открываю файл сохранения, я обнаружил

<?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-optional">
        <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"/>
        </properties>
    </persistence-unit>
</persistence>

и файл jdoconfig.xml

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

   <persistence-manager-factory name="transactions-optional">
       <property name="javax.jdo.PersistenceManagerFactoryClass"
           value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
       <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
       <property name="javax.jdo.option.NontransactionalRead" value="true"/>
       <property name="javax.jdo.option.NontransactionalWrite" value="true"/>
       <property name="javax.jdo.option.RetainValues" value="true"/>
       <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
   </persistence-manager-factory>
</jdoconfig>

С этим содержимым по умолчанию JPA не сохраняет в моем хранилище данных. Поэтому я редактирую файл 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-optional">
        <provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
        </properties>
    </persistence-unit>
</persistence>

Как мне изменить файл jdoconfig.xml? Прямо сейчас, с моими изменениями в persistence, но jdoconfig как есть, я получаю огромную трассировку ошибок.

отредактированная ошибка:

java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
    at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64)

…
…
...

Caused by: javax.persistence.PersistenceException: No persistence providers available for "transactions-optional" 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)

person Katedral Pillon    schedule 04.04.2013    source источник
comment
Поскольку в инструкции не упоминается файл jdoconfig.xml, пробовали ли вы удалить его и посмотреть, что произойдет? Я не эксперт в этом. Я только что посмотрел на инструкции, чтобы ответить.   -  person Konsol Labapen    schedule 05.04.2013
comment
Я пробовал это и много других подходов. До сих пор у меня все та же проблема: данные не сохраняются в хранилище данных.   -  person Katedral Pillon    schedule 05.04.2013
comment
Похоже, что у нескольких человек возникла одна и та же проблема (stackoverflow.com/questions/13464991/).   -  person Konsol Labapen    schedule 05.04.2013
comment
Спасибо за попытку помочь. Я удивлен, что эксперты остались в стороне (@DataNuclear @bossyLobster)   -  person Katedral Pillon    schedule 05.04.2013
comment
Я уверен, что Google задокументировал всех этих разработчиков. .google.com/appengine/docs/java/datastore/jpa/   -  person DataNucleus    schedule 05.04.2013


Ответы (1)


Для JPA 2.0 поставщиком является org.datanucleus.api.jpa.PersistenceProviderImpl Обратите внимание, что persistence.xml — это файл конфигурации, используемый JPA, а jdoconfig.xml используется, если вы хотите использовать JDO.

Сначала вам нужно решить, какой механизм сохранения вы хотите использовать, я бы предположил, что это JPA, поэтому на самом деле вы можете удалить jdoconfig.xml.

С учетом сказанного убедитесь, что все необходимые библиотеки для Datanucleus находятся в вашем CLASSPATH, и, что наиболее важно, persisence.xml должен находиться в ROOT вашего CLASSPATH.

Я добавил изображение библиотеки, необходимой для успешного сохранения JPA 2 / Datanucleus.

Также убедитесь, что ваш энхансер правильно настроен.

К вашему сведению: я никогда не мог заставить плагин Google Eclipse работать с JPA 2, улучшения сущностей никогда не работали, поэтому я использовал maven. Есть несколько способов улучшить ваши классы, и maven — один из них.

Вот мой пом.

    <properties>
            <!-- Convenience property to set the GWT version -->
            <gwtVersion>2.5.0</gwtVersion>
            <gxtVersion>2.2.5</gxtVersion>
            <gae.version>1.7.5</gae.version>
            <datanucleus.version>3.1.3</datanucleus.version>
            <!-- GWT needs at least java 1.5 -->
            <webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>

    <!-- DN -->
        <dependency>
            <groupId>com.google.appengine.orm</groupId>
            <artifactId>datanucleus-appengine</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
            <version>${datanucleus.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-api-jpa</artifactId>
            <version>${datanucleus.version}</version>
        </dependency>

        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-api-jdo</artifactId>
            <version>${datanucleus.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.jdo</groupId>
            <artifactId>jdo-api</artifactId>
            <version>3.0.1  </version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jpa_2.0_spec</artifactId>
            <version>1.0</version>
        </dependency>

    <dependency>
  <groupId>com.google.appengine</groupId>
  <artifactId>appengine-jsr107cache</artifactId>
  <version>${gae.version}</version>
</dependency>

    <dependency>
  <groupId>com.google.appengine</groupId>
  <artifactId>appengine-endpoints</artifactId>
  <version>${gae.version}</version>
</dependency>

    <dependency>
  <groupId>net.sf.jsr107cache</groupId>
  <artifactId>jsr107cache</artifactId>
  <version>1.1</version>
</dependency>

Для улучшений добавьте следующее в раздел плагинов вашего pom:

<plugin>
                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>${datanucleus.version}</version>
                <configuration>
                    <api>JPA</api>
                    <verbose>true</verbose>             
                     <mappingIncludes>**/entity/*.class</mappingIncludes>
                     <fork>false</fork>
                     <log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Измените <mappingIncludes>**/entity/*.class</mappingIncludes> на пакет, в котором размещены ваши объекты.

В моем случае DataNucleus Enhancer будет искать классы для улучшения в пакете/папке с именем entity.

Удачи

Бабаджиде

введите здесь описание изображения

person Babajide Prince    schedule 05.04.2013