【问题标题】:JDO / GAE inheritance + abstract superclass NPEJDO/GAE继承+抽象超类NPE
【发布时间】:2012-05-16 00:04:12
【问题描述】:

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

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

问候

【问题讨论】:

    标签: google-app-engine gwt jdo


    【解决方案1】:

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

    【讨论】:

    • 谢谢。似乎是一些配置工作。有时间我会试试的。
    【解决方案2】:

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

    多态关系不适用于 GAE... https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Polymorphic_Relationships

     @Persistent(mappedBy = "owner")
    private List<Media> ownedMediaSet = new ArrayList<Media>();
    

    让 Class 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>();
    

    【讨论】:

    • 感谢您的回答。我需要一种可能性来反映各种关系和继承,例如抽象超类。具体类型的列表是没有选择的。我想我会尝试使用 List 虽然它似乎不是很优雅。
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多