我想模拟一个简单的事情,但在从数据存储区读取时遇到麻烦。我发现这个问题有不同的风格,但在我的情况下没有一个答案有帮助(使用界面而不是抽象是没有选择)我有一个抽象类媒体:
@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)
我不明白。没有Media是抽象的,一切都很好。也许有人知道这个问题,可以给我一个提示。
此致
答案 0 :(得分:1)
您无法制作媒体列表...因为没有可实例化的媒体类。 - &GT;这意味着没有“数据库表”媒体
Polymorph关系不适用于GAE ... https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Polymorphic_Relationships
@Persistent(mappedBy = "owner")
private List<Media> ownedMediaSet = new ArrayList<Media>();
使类媒体不是抽象的,然后才有效。
或者你制作一部电影......
@Persistent(mappedBy = "owner")
private List<Movie> ownedMediaSet = new ArrayList<Movie>();
但那可能不是你想要的。
所以最后一个选项是这个artikle中的内容: https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Polymorphic_Relationships
列出密钥:
@Persistent
private List<Key> ownedMediaSet = new ArrayList<Key>();
答案 1 :(得分:0)
尝试使用Googles JDO插件的v2.0,看看它是怎么回事。可能它没有什么不同,但如果是这样,你可以在http://code.google.com/p/datanucleus-appengine/issues/list轻松地用简单的测试用例提出问题事实是v1插件以不合逻辑的方式做了一些事情(参见Sam的回答一些这种不合逻辑的处理导致的链接)。您也可以将继承策略设置为COMPLETE_TABLE,因为这是BigTable真正支持的所有内容(即每个类都有一个“Kind”,它包含该类型的所有属性)。