2012-08-25 66 views
1

我遇到問題了解如何在應用引擎上實現一對多的無主關係。我目前正在得到一個例外,我追溯到一個空的列表。與jpa 2.0和GAE數據存儲的一對多關係

@Entity 
public class Inventory extends DatastoreObject { 
    /** 
    * List of all inventory items in this object. 
    */ 
    @Unowned 
    //@OneToMany(cascade = CascadeType.ALL) 
    private List<InventoryItem> inventoryItems; 
} 

這是我試圖堅持實體時得到的異常。

java.lang.IllegalArgumentException: A collection of values is required. 
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:157) 
    at com.google.appengine.api.datastore.Query$FilterPredicate.<init>(Query.java:847) 
    at com.google.appengine.api.datastore.Query$FilterOperator.of(Query.java:77) 
    at com.google.appengine.api.datastore.Query.addFilter(Query.java:336) 
    at com.google.appengine.datanucleus.scostore.FKListStore.getChildrenByKeys(FKListStore.java:383) 
    at com.google.appengine.datanucleus.scostore.FKListStore.listIterator(FKListStore.java:360) 

看來datanucleus正在使用Filter IN查詢來獲取InventoryItem子實體。該列表最初是空的,並且不包含任何密鑰,因此這會破壞我的檢索。

下面是我的persistence.xml文件中的一個exert。

<exclude-unlisted-classes/> 

<properties> 
    <property name="datanucleus.NontransactionalRead" value="true"/> 
    <property name="datanucleus.NontransactionalWrite" value="true"/> 
    <property name="datanucleus.ConnectionURL" value="appengine"/> 
    <property name="datanucleus.singletonEMFForName" value="true"/> 
    <property name="datanucleus.appengine.relationDefault" value="unowned" /> 
    <property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/> 
</properties> 
+0

所以很奇怪的事情發生了。我更改List 以使用Set 並且它可以正常工作。令我困惑的是DataTypeUtils檢查類型是否爲instanceof Collection 。列表擴展集合。什麼是錯,或者我錯過了什麼。 –

+0

我希望將它們設置爲List,這樣我就不必更改我的GWT編輯器代碼來使用Set而不是List –

+2

GAE JPA有一些簡單的測試,用於在其代碼爲http://代碼的SVN中取代un-uni的1-N uni .google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/test/jpa/UnownedJPAOneToManyUniListSideA.java?spec = svn935&r = 935因此,請以此爲指導。它不會在持續顯示任何錯誤(但是你說你堅持,但提出檢索的東西)。 FWIW「DataNucleus」不做任何查詢,因爲它是僅提供核心設施的第三方庫; GAE JPA(由Google開發)是對其數據存儲進行任何調用的插件。 – DataNucleus

回答

0

您需要初始化集合

@OneToMany(fetch = FetchType.LAZY) 
@Unowned 
private List<InventoryItem> inventoryItems = new ArrayList<InventoryItem>();