java - 使用 Date 与 datanucleus 和应用程序引擎 (GAE Java) 进行类转换异常

标签 java google-app-engine jpa datanucleus

我有一个在 GAE 上运行的应用程序,使用 JPA 访问数据存储。

在尝试检索时,我的一种实体类型出现类转换异常。异常(exception)是:

Caused by: java.lang.ClassCastException: org.datanucleus.store.types.sco.simple.Date cannot be cast to java.lang.Long
    at com.annkh.entities.PurchasedQuote.jdoReplaceField(PurchasedQuote.java)
    at org.datanucleus.state.AbstractStateManager.replaceField(AbstractStateManager.java:2387)
    at org.datanucleus.state.JDOStateManager.replaceField(JDOStateManager.java:1877)
    at org.datanucleus.state.JDOStateManager.replaceField(JDOStateManager.java:1781)
    at org.datanucleus.store.types.sco.SCOUtils.createSCOWrapper(SCOUtils.java:241)
    at org.datanucleus.store.types.sco.SCOUtils.newSCOInstance(SCOUtils.java:139)
    at org.datanucleus.state.JDOStateManager.wrapSCOField(JDOStateManager.java:2230)
    at com.google.appengine.datanucleus.FetchFieldManager.fetchFieldFromEntity(FetchFieldManager.java:468)
    at com.google.appengine.datanucleus.FetchFieldManager.fetchObjectField(FetchFieldManager.java:408)
    at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:2353)
    at com.annkh.entities.PurchasedQuote.jdoReplaceField(PurchasedQuote.java)
    at com.annkh.entities.PurchasedQuote.jdoReplaceFields(PurchasedQuote.java)
    at org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1935)
    at org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1962)
    at com.google.appengine.datanucleus.EntityUtils$1.fetchFields(EntityUtils.java:974)
    at org.datanucleus.state.JDOStateManager.loadFieldValues(JDOStateManager.java:764)
    at org.datanucleus.state.JDOStateManager.initialiseForHollow(JDOStateManager.java:205)
    at org.datanucleus.state.StateManagerFactory.newForHollowPopulated(StateManagerFactory.java:89)
    at org.datanucleus.state.ObjectProviderFactory.newForHollowPopulated(ObjectProviderFactory.java:75)
    at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2882)
    at com.google.appengine.datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1014)
    at com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:229)
    at com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:226)
    at com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96)
    at com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121)
    at com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115)
    at com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151)
    at com.annkh.resources.MIResource.countPurchases(MIResource.java:67)
    at com.annkh.resources.MIResource.articlesListView(MIResource.java:60)

该实体有一个名为 datePurchased 的简单 java.util.Date 字段,它似乎导致了问题:

import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;

import static javax.persistence.GenerationType.IDENTITY;

@SuppressWarnings("serial")
@Entity
public class PurchasedQuote implements Serializable {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    protected Long id;
    <blah blah other fields>

    @Basic
    protected java.util.Date datePurchased;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    public java.util.Date getDatePurchased() {
        return datePurchased;
    }

    public void setDatePurchased(Date datePurchased) {
        this.datePurchased = datePurchased;
    }
}

导致错误的调用是一个简单的检索:

List<PurchasedQuote> quotes = purchaseDAO.findAll();
map.put("purchaseCount", quotes.size());

在 appengine 数据查看器中,该日期看起来与其他运行良好的对象中的其他日期没有什么不同。数据存储查看器中字段的类型为 gd:when。

我尝试过其他答案中建议的技巧(使用返回纯 java.util.Date 的方法包装和展开对 get 和 set 的调用),但似乎没有任何帮助。任何建议,将不胜感激。

最佳答案

这不是列/字段的问题datePurchased 。相反,它是您其他字段的问题(在代码中的 <blah blah other fields> 下),其中您的 Long 之一字段被错误地映射为 date类型列。只需一一检查字段和映射即可。供您引用,如果您没有指定字段的列名称,那么默认情况下它将假定字段名称是列名称。例如:

private String testCol;
// by default it assumes the column name as testCol

关于java - 使用 Date 与 datanucleus 和应用程序引擎 (GAE Java) 进行类转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703419/

相关文章:

java - 使用带有 Java 的 JSON API 在 Google Cloud Storage 中插入对象(作为文件夹)

java - 合并操作无异常但对数据库没有影响 Glassfish 4.1 JPA

java - JMS队列: Re-inserting a message vs Rolling Back

java - SE/FX 中的 JPA : how to integrate entities & data model used in TableView

java - Spring JAVAX 验证年份大于或等于当前年份

java - Google App Engine tmp 文件夹是否按实例隔离?

java - Jersey + App Engine 项目启动错误

mysql - java.sql.SQLException : target: commerce. 0.primary:vttablet:rpc 错误:代码 = InvalidArgument desc = 未知系统变量 'query_cache_size'

java - 使用 "crontab syntax"安排 EJB 任务

java - 奇怪的行为: Java escape euro sign