我想为一个简单的东西建模,但在从数据存储区读取时遇到了麻烦。我发现这个问题有不同的风格,但在我的情况下没有一个答案有帮助(使用接口而不是抽象是没有选择的)我有一个抽象类媒体:
@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 at
org.datanucleus.store.appengine.DatastoreTable.addFieldMapping(DatastoreTable.java:531)
at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK(DatastoreTable.java:440)
我不明白。没有 Media 是抽象的,一切都可以正常工作。也许有人知道这个问题,可以给我一个提示。
问候