2012-08-25 43 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>();