【问题标题】:JDO GAE One-to-Many problemJDO GAE 一对多问题
【发布时间】:2011-03-21 15:05:51
【问题描述】:

您好,我在从数据存储区检索数据时遇到一些问题...

我有几个马戏团,他们有一些吸引人的地方。

马戏团:

@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 出于某种原因为空.. 如果我查看数据查看器,则有马戏团和景点..: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"/>

【问题讨论】:

  • 请您显示设置attractions 列表的代码吗?您向我们展示的代码永远不会创建新的List&lt;Attraction&gt;。如果未设置该字段,则返回为 null。

标签: google-app-engine google-cloud-datastore jdo


【解决方案1】:

添加一个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/ 解决了这个问题。

【讨论】:

    【解决方案2】:

    在 JDO over GAE 中,类型化引用意味着拥有关系。因此,要使其正常工作,请尝试添加

    @Persistent(mappedBy="owningCircus")
    

    CircusAttraction 添加场地

    @Persistent private Circus owningCircus;
    

    这样在创建新景点时,设置 Circus 将隐式映射关系。 (请参阅下面链接中的“实体组”)

    如果您不想要拥有关系,只需保存一个键列表。 更多信息请访问http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html

    【讨论】:

    • 当我查看数据查看器时,我实际上看不到 Attraction 的 owningCircus 属性,也看不到景点。但是它们在代码中被标记为持久性。它们应该出现在那里吗? ?我猜他们是。
    猜你喜欢
    • 2013-11-11
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多