我正在开发基于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/