DataNucleus: ไม่มี StoreManager ประเภท appengine

ฉันกำลังพยายามตั้งค่าอินสแตนซ์ AppEngine ด้วย JPA โดยใช้ DataNucleus แต่ฉันได้รับข้อผิดพลาดต่อไปนี้ขณะรันไทม์เมื่อมีการโหลดหน่วยการคงอยู่:

[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)

ข้อผิดพลาดนี้เกิดขึ้นกับการปรับใช้ทั้งภายในเครื่องและ AppEngine

ฉันควรระบุค่าใดสำหรับคุณสมบัติ datanucleus.ConnectionURL ไม่ใช่ AppEngine หมายเหตุ ฉันไม่พบ doco ใด ๆ ที่อธิบายว่าค่านี้มีความหมายอย่างไรในสภาพแวดล้อม AppEngine มันหมายถึงอะไรที่จะเชื่อมโยงกับ?

ฉันตั้งใจจะกำหนด StoreManager ที่ไหนสักแห่งหรือไม่

ฉันขาดห้องสมุดบ้างไหม? ถ้าเป็นเช่นนั้นอะไร?

Peristence.xml ของฉันคือ:

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

การพึ่งพาใน POM ของฉันคือ: 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>

และปลั๊กอินดาต้านิวเคลียสคือ:

    <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 แหล่งที่มา


คำตอบ (1)


หากคุณยังคงใช้ RDBMS (ซึ่งตรงข้ามกับ GAE/Datastore) อาจปฏิบัติตามเอกสารประกอบสำหรับ URL http://www.datanucleus.org/products/accessplatform/datastores/rdbms.html

หากคุณยังคงใช้ GAE/Datastore ต่อไป คุณจะต้องลบ "datanucleus-rdbms" ออกจาก CLASSPATH ของคุณ และเพิ่ม com.google.appengine.orm "datanucleus-appengine" และให้ความสนใจกับเอกสารความเข้ากันได้ที่ https://code.google.com/p/datanucleus-appengine/wiki/Compatibility ซึ่งบอกว่าคุณไม่สามารถใช้ DataNucleus 3.2/3.3 ได้ เว้นแต่คุณจะใช้ datanucleus-appengine เวอร์ชันที่สร้างขึ้นด้วยตนเอง (ยังไม่ได้เผยแพร่) จาก SVN ของ Google

person Neil Stockton    schedule 21.04.2014
comment
ฉันยังคงใช้ GAE/Datastore ต่อไป - person William; 21.04.2014
comment
ยอดเยี่ยม. ขอบคุณนีล ฉันเพิกเฉยต่อเอกสารความเข้ากันได้เพราะเมื่อพวกเขาพูดว่าปลั๊กอิน ฉันคิดว่าพวกเขากำลังพูดถึงปลั๊กอิน maven และถือว่าเอกสารความเข้ากันได้นั้นล้าสมัย ฉันคิดว่ามันหมายถึง ORM หรืออะแดปเตอร์ระหว่าง ORM และ GAE Datastore - person William; 22.04.2014
comment
ฉันยังไม่พบ doco ใด ๆ ที่แนะนำว่า datanucleus-rdbms จำเป็นต้องเปลี่ยนเป็น datanucleus-appengine หรือจริงๆ แล้ว datanucleus-rdbms คืออะไร ขอบคุณสำหรับความชัดเจน - person William; 22.04.2014