1

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

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

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


数据.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(){}

// ...
}

项目.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字段不为 null

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

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

// ...

service.load(...);
4

2 回答 2

4

我花了几个小时试图理解这一点。子对象不会与它们的父对象一起加载,因为它们是延迟加载的。query.execute()不返回子字段。仅当您尝试访问它们时才会加载它们(data0.getItem()例如,使用 a )。在您的情况下,您在关闭 后尝试访问子对象PersistenceManager,因此不会加载它们。

于 2010-11-12T17:51:20.500 回答
0

我在 Datastore 上的 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 !!!!!
}
于 2018-03-12T12:14:30.933 回答