Google App Engine、JDO 和 equals/hashCode

Posted

技术标签:

【中文标题】Google App Engine、JDO 和 equals/hashCode【英文标题】:Google App Engine, JDO, and equals/hashCode 【发布时间】:2010-12-11 03:11:03 【问题描述】:

我在 Google App Engine 中有一个运行良好的应用。我意识到我忘记实现 equals 和 hashCode 的一个 JDO 增强对象(我需要在一组中使用该对象)。所以我做了。在这些实现中我并没有真正做任何特别的事情,实际上我只是使用 Eclipse 来生成它们。像这样:

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent
private String appleId;

@Override
public int hashCode() 
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((appleId == null) ? 0 : appleId.hashCode());
    return result;


@Override
public boolean equals(Object obj) 
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    User other = (User) obj;
    if (appleId == null) 
        if (other.appleId != null)
            return false;
     else if (!appleId.equals(other.appleId))
        return false;
    return true;

所以现在,当我尝试点击应用程序中的任何 URL 时,会抛出此异常:

/addUser javax.jdo.JDOUserException:持久类“类 com.bpapa.myapp.domain.User 似乎没有得到增强。您可能需要重新运行增强器并检查输出中的错误。”数据库中没有表,但操作需要它。请检查该类的元数据规范。 在 org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:427) 在 org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:249) 在 com.bpapa.myapp.servlet.AddUserServlet.doPost(AddUserServlet.java:34)

关于我做错了什么有什么想法吗?

【问题讨论】:

【参考方案1】:

您是否已将 eclipse 设置为自动运行 datanucleus 增强器?如果您尝试使用 project->clean 清理项目,然后从头开始构建项目会怎样?

【讨论】:

做干净固定的事情。【参考方案2】:

eclipse 中的配置(“运行 datanucleus 增强器” - 如上所述的相关问题)

项目设置 -> Google -> App Engine -> ORM

将 src parh "src/" 路径更改为 JDO 类的确切 "src//" 路径

【讨论】:

【参考方案3】:

我遇到了同样的问题,当我执行 Project -> Clean 时,我在日志中看到以下异常:

Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Documents%20and%20Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/C:/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.4.2_1.4.2.v201102111811/appengine-java-sdk-1.4.2/lib/user/orm/datanucleus-appengine-1.0.8.final.jar."

所以,我删除了:

C:/Documents and Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar

从 eclipse 项目开始,经过清理和重建,一切都开始按预期工作。

【讨论】:

你看到了什么日志?【参考方案4】:

我通过更新到最新版本的 appengine java sdk 解决了这个问题。

【讨论】:

以上是关于Google App Engine、JDO 和 equals/hashCode的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine (JDO) 中 ID 的 Key 或 Long

Google App Engine 的 JDO:转义引号

在哪里使用 JDO/Google App Engine 设置 TransactionOptions?

为啥 Google App Engine 文档强调 JDO 而不是 JPA?

Google App Engine 上的 JDO 与 JPA for Java

在 Google App Engine 上将 JDO 与 HRD 结合使用