我正在研究基於GAE的應用程序,它使用JDO訪問數據存儲。我需要實現持久對象之間的多態關係。Google App Engine中的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(參照);
JDOObjectNotFoundException異常被拋出(javax.jdo.JDOObjectNotFoundException:沒有這樣的對象FailedObject:...)。
如果我和getObjectById(class, key)方法做到這一點:
父對象= pm.getObjectById(Parent.class,基準);
FatalNucleusUserException則拋出異常(org.datanucleus.store.appengine.FatalNucleusUserException:收到的請求以找到一種父但在提供的標識符的一個目標是一個關鍵的對兒童種類的字符串表示)
什麼是正確的方式來檢索其他實體中引用的子類之一的實例?
UPDATE:我發現this線程在GAE谷歌組,但坦率地說,它並沒有幫助我很多。
由於目前沒有多態支持,我提出了一種解決方法 - 存儲有關引用對象的類型。 – Kel 2011-01-21 06:45:42