2012-05-07 79 views
1

我想建模一個簡單的東西,但從數據存儲讀取時遇到麻煩。我發現,在不同的味道這個問題,但沒有一個答案在我的幫助的情況下(使用接口而不是抽象的任何選項)從來就一個抽象類媒體:JDO/GAE繼承+抽象超類NPE

@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) 

我不明白這一點。沒有媒體被抽象,一切正常。也許有人知道這個問題,可以給我一個提示。

問候

回答

1

因爲沒有實例化類的媒體你不能讓媒體名單...。 - >這意味着沒有「數據庫表」媒體

變形術關係doesen't工作,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

使鍵列表:谷歌JDO插件

@Persistent 
private List<Key> ownedMediaSet = new ArrayList<Key>(); 
+0

感謝您的回答。我需要反映各種關係和繼承的可能性,例如抽象的超類。具體類型的列表是無法選擇的。我想我會嘗試列表雖然它似乎不是很優雅。 – Frodo

0

嘗試v2.0和看到如何繼續下去。可能它沒有什麼不同,但如果是這種情況,你可以用簡單的測試案例在http://code.google.com/p/datanucleus-appengine/issues/list很容易地提出問題事實是v1插件做了一些不合邏輯的事情(參見Sam的一些鏈接的回答,這種不合邏輯的處理)。您也可以將繼承策略設置爲COMPLETE_TABLE,因爲這是BigTable真正支持的全部(即每個類都有一個「Kind」,該類型包含該類型的所有屬性)。

+0

謝謝。似乎是一些配置工作。一旦我有時間,我會嘗試。 – Frodo