DataNucleus: Tidak ada StoreManager tipe appengine yang tersedia

Saya mencoba menyiapkan instance AppEngine dengan JPA menggunakan DataNucleus. Tapi saya mendapatkan kesalahan berikut saat runtime ketika unit persistensi dimuat:

[INFO] Caused by: java.lang.ExceptionInInitializerError
[INFO]  at org.apache.jsp.guestbook_jsp._jspService(guestbook_jsp.java:123)
[INFO]  ... 45 more
[INFO] Caused by: org.datanucleus.exceptions.NucleusUserException: There is no available StoreManager of type "appengine". Make sure that you have put the relevant DataNucleus store plugin in your CLASSPATH and if defini
ng a connection via JNDI or DataSource you also need to provide persistence property "datanucleus.storeManagerType"
[INFO]  at org.datanucleus.NucleusContext.createStoreManagerForProperties(NucleusContext.java:1276)
[INFO]  at org.datanucleus.NucleusContext.initialise(NucleusContext.java:357)
[INFO]  at org.datanucleus.api.jpa.JPAEntityManagerFactory.initialiseNucleusContext(JPAEntityManagerFactory.java:816)
[INFO]  at org.datanucleus.api.jpa.JPAEntityManagerFactory.initialise(JPAEntityManagerFactory.java:437)
[INFO]  at org.datanucleus.api.jpa.JPAEntityManagerFactory.<init>(JPAEntityManagerFactory.java:396)
[INFO]  at org.datanucleus.api.jpa.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:116)
[INFO]  at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
[INFO]  at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)

Kesalahan ini terjadi untuk penerapan lokal dan AppEngine.

Nilai apa yang harus saya berikan untuk properti datanucleus.ConnectionURL bukan AppEngine? NB Saya tidak dapat menemukan dokumen apa pun yang menjelaskan arti sebenarnya dari nilai ini di lingkungan AppEngine. Apa maksudnya menghubungkan?

Apakah saya bermaksud mendefinisikan StoreManager di suatu tempat?

Apakah saya melewatkan beberapa perpustakaan? Jika ya, apa?

Kegigihan saya.xml adalah:

<persistence-unit name="main">
    <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>

    <mapping-file>/META-INF/user.xml</mapping-file>

    <properties>
        <property name="datanucleus.NontransactionalRead" value="true"/>
        <property name="datanucleus.NontransactionalWrite" value="true"/>
        <property name="datanucleus.ConnectionURL" value="appengine"/>

        <!--property name="datanucleus.appengine.datastoreReadConsistency" value="EVENTUAL" /-->
        <!--property name="javax.persistence.query.timeout" value="5000" /-->
        <!--property name="datanucleus.datastoreWriteTimeout" value="10000" /-->
        <property name="datanucleus.singletonEMFForName" value="true"/>
    </properties>
</persistence-unit>

Ketergantungan di POM saya adalah: com.google.appengine appengine-api-1.0-sdk ${appengine.target.version}

    ..

    <!-- Persistence APIs -->
    <dependency> <!-- why do I need this if I am using JPA? -->
        <groupId>javax.jdo</groupId>
        <artifactId>jdo-api</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>javax.persistence</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-core</artifactId>
        <version>[3.2.0, 3.2.99)</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-api-jpa</artifactId>
        <version>[3.3.0-release, 3.3.99)</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-rdbms</artifactId>
        <version>[3.2.0, 3.2.99)</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Dan plugin datanucleusnya adalah:

    <plugin>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-maven-plugin</artifactId>
        <version>3.3.0-release</version>
        <configuration>
            <api>JPA</api>
            <persistenceUnitName>main</persistenceUnitName>
            <verbose>true</verbose>
        </configuration>
        <executions>
            <execution>
                <phase>process-classes</phase>
                <goals>
                    <goal>enhance</goal>
                </goals>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>org.datanucleus</groupId>
                <artifactId>datanucleus-core</artifactId>
                <version>[3.2.0, 3.2.99)</version>
            </dependency>
            <dependency>
                <groupId>org.datanucleus</groupId>
                <artifactId>datanucleus-api-jpa</artifactId>
                <version>[3.3.0-release, 3.3.99)</version>
            </dependency>
        </dependencies>
    </plugin>

person William    schedule 21.04.2014    source sumber


Jawaban (1)


Jika Anda tetap menggunakan RDBMS (dan bukan GAE/Datastore), mungkin ikuti dokumentasinya untuk URL http://www.datanucleus.org/products/accessplatform/datastores/rdbms.html

Jika Anda tetap menggunakan GAE/Datastore, hapus "datanucleus-rdbms" dari CLASSPATH dan tambahkan com.google.appengine.orm "datanucleus-appengine". Dan perhatikan dokumen kompatibilitas di https://code.google.com/p/datanucleus-appengine/wiki/Compatibility yang menyatakan Anda tidak dapat menggunakan DataNucleus 3.2/3.3 kecuali Anda menggunakan versi datanucleus-appengine yang dibuat secara manual (belum dirilis) dari SVN Google

person Neil Stockton    schedule 21.04.2014
comment
Saya tetap menggunakan GAE/Datastore. - person William; 21.04.2014
comment
Bagus sekali. Terima kasih Neil. Saya telah mengabaikan dokumen kompatibilitas karena ketika mereka mengatakan plugin, saya pikir mereka sedang membicarakan plugin maven dan berasumsi bahwa dokumen kompatibilitas sudah ketinggalan zaman. Menurut saya, yang dimaksud sebenarnya adalah ORM atau adaptor antara ORM dan Penyimpanan Data GAE. - person William; 22.04.2014
comment
Saya juga belum menemukan dokumen apa pun yang menyarankan datanucleus-rdbms perlu ditukar dengan datanucleus-appengine. Juga bukan apa sebenarnya datanucleus-rdbms itu. Terima kasih atas kejelasannya. - person William; 22.04.2014