GWT JDO关系问题 - 来自数据存储区的对象的子项为null

时间:2010-09-09 10:12:28

标签: gwt jdo relationship datastore

我在尝试实现GWT JDO功能时遇到问题。假设有一个包含Data对象的Item对象。在数据存储区中,这将创建一对一的关系。

问题在于,当我尝试从数据存储中获取对象时,“item”字段始终为null 。当然,我将对象放在包含初始化Item对象(列表末尾)的数据存储区中。查看数据存储区时,DataItem个实体都存在。

我是否管理一对一关系错误?还需要什么?同样的情况是当我尝试创建一对多关系(Item的数组)


Data.java:

package com.rafalrybacki.jdotest.client.model;

import java.io.Serializable;
import java.util.ArrayList;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Data implements Serializable {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@Persistent
private String symbol;

@Persistent
public Item item;

public Data(){}

// ...
}

Item.java:

package com.rafalrybacki.jdotest.client.model;

import java.io.Serializable;

import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Item implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey;

@Persistent
public String title;

public Item(){}

public Item(String title){
    this.title = title;
}

// ...
}

服务器端实施:

public void save(Data data) {
    PersistenceManager pm = PersistenceManagerFactoryGetter.get().getPersistenceManager();
    try {
        pm.makePersistent(data);
    } finally {
        pm.close();
    }
    return;
}

public Item load() {
    PersistenceManager pm = PersistenceManagerFactoryGetter.get().getPersistenceManager();
    List<Data> datas = new ArrayList<Data>();
    Data data0 = null;
    try {
        Query q = pm.newQuery(Data.class);
        datas = (List<Data>) q.execute();
        if (datas.size() > 0)
            data0 = pm.detachCopy(datas.get(0)); // get first item only

    } finally {
        pm.close();
    }
    return data0.item;  // always null !!!!!
}

在客户端我正在使用此类已创建的data对象(item字段非空

Data d = new Data("data1");
d.item = new Item("item2");

service.save(d, ...); //rpc service call

// ...

service.load(...);

2 个答案:

答案 0 :(得分:4)

我试图理解这一点我失去了几个小时。 子对象未加载父项,因为它们是懒惰加载的。 query.execute()不返回子字段。只有在您尝试访问它们时才会加载它们(例如,使用data0.getItem())。在您的情况下,您在关闭PersistenceManager后尝试访问子对象,因此它们未被加载。

答案 1 :(得分:0)

我在数据存储区的JDO中经历过类似的用例,并且可以解决有关工作的问题。 因此,如果您想在任何情况下从Persistence Manager分离数据存储区对象,也要读取子对象。最好首先读取子对象,然后分离esp。如果子对象不是默认的提取组对象/实体。 例如。

public Item load() {
    PersistenceManager pm = 
    PersistenceManagerFactoryGetter.get().getPersistenceManager();
    List<Data> datas = new ArrayList<Data>();
   Data data0 = null;
try {
    Query q = pm.newQuery(Data.class);
    datas = (List<Data>) q.execute();
    if (datas.size() > 0)
        data0=datas.get(0);
        data0.getItem();//call getter for child object
        pm.detachCopy(data0); // then detach

} finally {
    pm.close();
}
    return data0.getItem();  // should return non-null !!!!!
}