Проблема отношений GWT JDO - дочерний объект из хранилища данных является нулевым - PullRequest
1 голос
/ 09 сентября 2010

Я сталкиваюсь с проблемами при попытке реализовать функции GWT JDO. Допустим, есть объект Data, который содержит объект Item. В хранилище данных это создаст отношения один-к-одному.

Проблема в том, что когда я пытаюсь получить объект из хранилища данных, поле 'item' всегда равно null . Конечно, я помещаю объект в хранилище данных, которое содержит инициализированный объект Item (конец списка). При просмотре хранилища данных сущности Data и Item существуют.

Правильно ли я отношусь один к одному? Что еще нужно? Та же самая ситуация, когда я пытаюсь создать отношение один ко многим (массив 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 ]

4 голосов
/ 12 ноября 2010

Я потерял несколько часов, пытаясь понять это. Дочерние объекты не загружаются с их родителями, потому что они загружаются лениво. query.execute() не возвращает дочерние поля. Они загружаются, только если вы пытаетесь получить к нему доступ (например, с data0.getItem()). В вашем случае вы пытаетесь получить доступ к дочернему объекту после закрытия PersistenceManager, поэтому они не загружаются.

0 голосов
/ 12 марта 2018

Я сталкивался с подобными примерами использования в JDO в Datastore и после обходных работТак что, если вы хотите в любом случае отсоединить объект хранилища данных от 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 !!!!!
}
...