1

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

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

问候

4

2 回答 2

1

您不能列出媒体...因为没有可实例化的媒体类。--> 这意味着没有“数据库表”媒体

多态关系不适用于 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>();

但这可能不是你想要的。

所以最后一个选项是这篇文章中的内容: https ://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Polymorphic_Relationships

列出密钥列表:

@Persistent
private List<Key> ownedMediaSet = new ArrayList<Key>();
于 2012-05-07T13:38:08.710 回答
0

试试 Google 的 JDO 插件 v2.0,看看效果如何。可能它没有什么不同,但如果是这样的话,你可以很容易地在http://code.google.com/p/datanucleus-appengine/issues/list上用简单的测试用例提出问题事实上 v1 插件做了一些以不合逻辑的方式处理事情(有关这种不合逻辑的处理导致的一些链接,请参见 Sam 的回答)。您也可以只将继承策略设置为 COMPLETE_TABLE,因为这是 BigTable 真正支持的所有内容(即每个类都有一个“种类”,其中包含该类型的所有属性)。

于 2012-05-07T17:21:39.900 回答