我正在开发基于GAE的应用程序,该应用程序使用JDO访问数据存储。我需要实现持久对象之间的多态关系。

有一个抽象的父类:

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Parent {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
 String id;

    // ....


以及几个子类:

@PersistenceCapable (identityType = IdentityType.APPLICATION)
public class Child extends Parent {

    // ....


另外,还有一个类,应该参考其中一个子类。根据"Polymorphic Relationships" section of "Entity Relationships in JDO" article,实现这种关系的最佳方法是存储对象的键,因此此类的外观如下:

@PersistenceCapable (identityType = IdentityType.APPLICATION)
public class OtherClass {

    @Persistent
    private String reference;

    // ....


我从OtherClass实例检索引用对象的字符串键。然后,我想获取引用对象本身:它是Parent子类之一的实例。但:


如果我使用pm.getObjectById(oid)方法执行此操作:

对象object = pm.getObjectById(reference);


抛出JDOObjectNotFoundException异常(javax.jdo.JDOObjectNotFoundException:没有这样的对象FailedObject:...)。


如果我使用getObjectById(class, key)方法执行此操作:

父对象= pm.getObjectById(Parent.class,参考);


抛出FatalNucleusUserException异常(org.datanucleus.store.appengine.FatalNucleusUserException:收到了寻找类型为Parent的对象的请求,但提供的标识符是类型为Child的Key的String表示形式)

检索另一个实体中引用的子类之一的实例的正确方法是什么?

更新:我在GAE Google组中找到了this线程,但坦率地说,它对我没有太大帮助。

最佳答案

App Engine的JDO层目前不支持多态。实际上,我不确定JDO是否总体上支持它。

关于java - Google App Engine中的JDO:应如何实现多态关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4737150/

10-08 21:25