我想建模一個簡單的東西,但從數據存儲讀取時遇到麻煩。我發現,在不同的味道這個問題,但沒有一個答案在我的幫助的情況下(使用接口而不是抽象的任何選項)從來就一個抽象類媒體:JDO/GAE繼承+抽象超類NPE
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION,
detachable="true")
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Media implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk",
value="true")
...
@Persistent
User owner;
}
電影正在擴展它。
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION,
detachable="true")
public class Movie extends Media implements Serializable{
...
}
一個用戶有一個媒體列表。
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION,
detachable="true")
public class User implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk",
value="true")
protected String id;
@Persistent(mappedBy = "owner")
private List<Media> ownedMediaSet = new ArrayList<Media>();
}
的讀取操作的代碼是:
@Override
public List<UserDTO> readAllUser() throws IllegalArgumentException {
ArrayList<UserDTO> result = new ArrayList<UserDTO>();
PersistenceManager pm = pmf.getPersistenceManager();
Query q = pm.newQuery("select from " + User.class.getName());
List<User> res = null;
try {
res = (List<User>) q.execute();
for (User u : res) {
UserDTO uDTO = new UserDTO(u.getId(),null, u.getName(), u.getEmail());
result.add(uDTO);
}// for
} catch
這將導致NPE: 顯示java.lang.NullPointerException 在
org.datanucleus.store.appengine.DatastoreTable.addFieldMapping(DatastoreTable.java:531)
at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK(DatastoreTable.java:440)
我不明白這一點。沒有媒體被抽象,一切正常。也許有人知道這個問題,可以給我一個提示。
問候
感謝您的回答。我需要反映各種關係和繼承的可能性,例如抽象的超類。具體類型的列表是無法選擇的。我想我會嘗試列表雖然它似乎不是很優雅。 –
Frodo