JDO GAE проблема «один ко многим» - PullRequest
1 голос
/ 21 марта 2011

Привет, у меня возникли некоторые проблемы при получении данных из хранилища данных ...

У меня есть несколько цирков, у которых есть некоторое количество достопримечательностей.

Цирк:

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Circus implements Serializable
{
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")  
    private String key;
    @Persistent
    private String name;
    @Persistent(mappedBy = "owningCircus")
    @Element(dependent = "true")
    public List<Attractions> attractions;

    public Circus()
    {

    }

    public Circus(String name)
    {
        this.name = name;
        this.attractions = new ArrayList<Attractions>();
    }
    public void addAttraction(Attraction attr)
    {
            this.attractions.add(attr);
    }
    // Get/Set
}

Аттракцион:

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

    //...

    public Attraction()
    {

    }

    public Attraction(Circus owning, String name)
    {
        this.name = name;
        this.owningCircus = owning;
    }
    // Get/Set
}

Вот так я и получаю цирки

public List<Circus> getCircuses()
    {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query query = pm.newQuery("select from " + Circus.class.getName()); 
        List<Circus> circuses = (List<Circus>) query.execute();

        for(Circus c : circuses)
        {
            //Poke the list of attractions so they are loaded.
            //however, c.attractions==null => NullPointerException
            c.attractions.size();
        } 

        List<Circus> ret = (List<Circus>) pm.detachCopyAll(circuses);       

        pm.close();

        return ret;
    }

Цирк так сохраняется

public void addCircus(Circus circus)
    {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        pm.makePersistent(circus);
        pm.close();
    }
//...
Circus a =new Circus("Super Circus");
a.addAttraction(new Attraction(a,"George the clown"));
addCircus(a);

c.attractions для NULLпо какой-то причине .. Если я загляну в Data Viewer, там есть и цирки, и аттракционы ..: s

Спасибо

РЕДАКТИРОВАТЬ: Добавлено, как сохраняется цирк, а такжекак владелец цирка.

РЕДАКТИРОВАТЬ 2

Я действительно получаю это исключение:

com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found..      <datastore-index kind="Attraction" ancestor="true" source="manual">
        <property name="attractions_INTEGER_IDX" direction="asc"/>

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Добавление datastore-indexes.xml, содержащего

<?xml version="1.0" encoding="utf-8"?> <datastore-indexes   autoGenerate="true"> 
<datastore-index kind="Attraction" ancestor="true" source="manual">
        <property name="attractions_INTEGER_IDX" direction="asc"/>
    </datastore-index>
</datastore-indexes>

to war / WEB-INF / решил проблему.

0 голосов
/ 21 марта 2011

В JDO over GAE типизированные ссылки подразумевают собственные отношения.Поэтому, чтобы все заработало, попробуйте добавить

@Persistent(mappedBy="owningCircus")

к Цирку и Аттракцион добавить поле

@Persistent private Circus owningCircus;

Таким образом, при созданииНовая привлекательность, установка Цирка будет неявно отображать отношения.(см. «группы сущностей» в ссылке ниже)

Если вы не хотите, чтобы ваши отношения принадлежали, просто держите список ключей.Подробнее об этом на http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html

...