2013-04-04 39 views
2

使用Google Eclipse插件,我的项目在META-INF文件夹中自动带有两个文件:jdoconfig.xmlpersistence.xml。每对https://developers.google.com/appengine/docs/java/datastore/jpa/overview的说明,我的持久性文件,应该有JPA数据存储的存储下面一行:如何编辑jdoconfig.xml和persistence.xml以便JPA保存到appengine数据存储区

<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) 
+0

由于指令没有提到'jdoconfig.xml'文件,你有没有尝试删除它,看看会发生什么?我不是这方面的专家。我只是看着说明来回答。 – 2013-04-04 21:37:12

+0

我试过了,还有很多其他的方法。到目前为止,我仍然遇到同样的问题:数据不会持久存在数据存储中。 – 2013-04-04 21:49:58

+0

它看起来像一些人有相同的问题(http://stackoverflow.com/questions/13464991/no-persistence-providers-available-for-transactions-optional)。 – 2013-04-05 00:44:00

回答

6

对于JPA 2.0提供商org.datanucleus.api.jpa.PersistenceProviderImpl请注意,persistence.xml是JPA和jdoconfig.xml使用的配置文件使用,如果你想使用JDO。

您首先需要决定要使用的持久性机制,我会假设其JPA,因此实际上您可以删除jdoconfig.xml

这样说的话,确保Datanucleus的所有需要​​的库都在你的CLASSPATH中,最重要的是,persisence.xml必须位于CLASSPATH的ROOT中。

我添加了成功的JPA 2/Datanucleus persitence所需的lib的图片。

还要确保您的增强器配置正确。如果我使用Google Eclipse插件无法使用JPA 2,那么实体增强功能从未工作过,所以我使用了maven。有几种方法可以增强您的课程,maven是一种。

这是我的pom。

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

对于增强,添加甲醛以下到插件部分:

<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的包/文件夹中寻找要增强的类。

好运

Babajide

enter image description here