JDO / GAE继承+抽象超类NPE

时间:2012-05-07 13:15:06

标签: google-app-engine gwt jdo

我想模拟一个简单的事情,但在从数据存储区读取时遇到麻烦。我发现这个问题有不同的风格,但在我的情况下没有一个答案有帮助(使用界面而不是抽象是没有选择)我有一个抽象类媒体:

@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是抽象的,一切都很好。也许有人知道这个问题,可以给我一个提示。

此致

2 个答案:

答案 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”,它包含该类型的所有属性)。