【问题标题】:ArrayIndexOutOfBoundsException when trying to persist an ArrayList of Objects which utilise inheritence尝试持久化利用继承的对象的 ArrayList 时出现 ArrayIndexOutOfBoundsException
【发布时间】:2011-08-07 23:40:13
【问题描述】:

我有 3 个类:Person、Car 和 Model。

Person 定义了一个 ArrayList 属性:

List<Car> cars;

Car 是 Model 类扩展的抽象类,即

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Car {

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  protected Key key;

  public Car() {
  }

}

模型扩展汽车:

@PersistenceCapable
public class Model extends Car {

  public Model() {
  }

}

我加载一个 Person 对象并创建一个新的 Car 对象,即

Person personObj = pm.getObjectById(Person.class, key);
Car newCar = new Model();

然后我尝试通过将新 Car 添加到 Person 类中的“cars”属性来持久化它,即

personObj.getCars().add(newCar);

但是,当我尝试使用此 App Engine 时,会引发以下异常:

java.lang.ArrayIndexOutOfBoundsException: 0
    at org.datanucleus.store.mapped.scostore.FKListStore.<init>(FKListStore.java:133)
    at org.datanucleus.store.appengine.DatastoreFKListStore.<init>(DatastoreFKListStore.java:41)
    at org.datanucleus.store.appengine.DatastoreManager.newFKListStore(DatastoreManager.java:528)
    at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection(MappedStoreManager.java:729)
    at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField(MappedStoreManager.java:646)
    at org.datanucleus.sco.backed.List.<init>(List.java:104)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:112)
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:120)
    at org.datanucleus.util.ClassUtils.newInstance(ClassUtils.java:94)
    at org.datanucleus.sco.SCOUtils.newSCOInstance(SCOUtils.java:164)
    at org.datanucleus.store.mapped.mapping.AbstractContainerMapping.replaceFieldWithWrapper(AbstractContainerMapping.java:426)
    at org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:165)
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks(DatastoreRelationFieldManager.java:217)
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.access$200(DatastoreRelationFieldManager.java:48)
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.apply(DatastoreRelationFieldManager.java:116)
    at org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations(DatastoreRelationFieldManager.java:81)
    at org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations(DatastoreFieldManager.java:955)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.storeRelations(DatastorePersistenceHandler.java:546)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess(DatastorePersistenceHandler.java:304)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:256)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:240)
    at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
    at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161)
    at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298)
    at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1170)
    at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669)
    at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)

这听起来很像这里提出的类似问题:http://groups.google.com/group/google-appengine-java/browse_thread/thread/adf298a9a5b4bd03

以前有其他人见过这个问题吗?

谢谢

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

    据我了解,personObj.getCars() 返回List &lt;Car&gt; cars;

    由于您没有提供太多代码,我正在做出推论,但仅使用List &lt;Car&gt; cars; 会将cars 设置为null

    我不确定应用引擎平台是如何工作的,但它可能会发送 AIOOBE 而不是 NPE。

    不管是什么原因,你都应该实例化...cars = new ArrayList();

    【讨论】:

    • 如果cars 为空,他将获得NullPointerException
    【解决方案2】:

    我不确定这是否是您的问题的根本原因(如果是,这是一种相当不直观的错误显示方式),但 App Engine 上的 JDO 不支持多态性。尝试不使用抽象“汽车”类的示例。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2016-05-14
      • 2014-11-13
      • 2011-05-04
      • 1970-01-01
      • 2016-02-17
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多