【问题标题】:Error while making object persistent使对象持久化时出错
【发布时间】:2012-05-08 04:49:35
【问题描述】:

我正在尝试使用 JDO 在 GAE 平台上编写 Vaadin 应用程序,当我想调用此方法时:

public void createUser(String login, String password, String email) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    User user = new User(login, password, email);
    try {
        pm.makePersistent(user);
    } finally {
        pm.close();
    }

}

我收到此错误:

(...) 引起:javax.jdo.JDOFatalUserException:必须指定名为 javax.jdo.PersistenceManagerFactoryClass 的属性,或者必须在包含 META-INF/services/javax.jdo.PersistenceManagerFactory 条目的 jar 文件中必须指定类路径或名为 javax.jdo.option.PersistenceUnitName 的属性。 嵌套的Throwables: javax.jdo.JDOUserException:您已经为此 PMF 指定使用“transactions-optional”的“persistence-unit”(但它不存在!),或者您使用“transactions-optional”作为名称调用 JDOHelper.getPersistenceManagerFactory一个属性文件(这在 CLASSPATH 中不存在) 在 javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:856) 在 javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:1092) 在 javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:914) 在 myapp.PMF.(PMF.java:8) ... 43 更多 引起:javax.jdo.JDOUserException:您已指定此 PMF 使用“事务可选”的“持久性单元”(但它不存在!),或者您使用“事务可选”调用 JDOHelper.getPersistenceManagerFactory 作为属性文件的名称(在 CLASSPATH 中不存在)(...)

我搜索了谷歌并找到了一些解决这个问题的方法,但没有一个适用于我的应用程序(或者我做错了什么)。 例如,this 不起作用。哦,我在 META-INF 中有 jdoconfig.xml 文件。 如果有人有类似的问题,并且愿意分享他的智慧,我将不胜感激。

编辑:jdoconfig 文件:

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

【问题讨论】:

  • 您还没有告诉我们您的 jdoconfig.xml 或 persistence.xml 文件,以及它们的位置
  • 我告诉过:我在 META-INF 中有 jdoconfig.xml 文件。

标签: google-app-engine persistence vaadin google-cloud-datastore jdo


【解决方案1】:

知道了!

jdoconfig.xml

文件在

\war\META-INF

Eclipse 创建的目录。应该在

\war\WEB-INF\classes\META-INF

愚蠢的错误......

【讨论】:

  • 这个war目录在哪里??我一直在寻找解决方案,但在我的应用程序和端点目录中都没有看到这个 war 目录
  • 实际上在您的项目中,您需要在“WEB-INF”下创建“classes”子文件夹,在“classes”下创建“META-INF”子文件夹。这不是一个愚蠢的错误,从 GAE 教程中我错误地知道我需要在与 WEB-IF 相同的级别上创建 META-INF 文件夹(因为它适用于大多数 Web 项目,但不适用于 JDO 的 jdoconf。 xml).
猜你喜欢
  • 2014-11-13
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2012-01-17
  • 1970-01-01
  • 2012-03-31
相关资源
最近更新 更多