与jpa 2.0和GAE数据存储区的1对多关系

时间:2012-08-25 20:04:47

标签: java google-app-engine jpa-2.0 datanucleus

我在理解如何在app引擎上实现1对多无主关系时遇到问题。我正在获得一个异常,我追溯到一个空列表。

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

1 个答案:

答案 0 :(得分:0)

您需要初始化集合

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