GAE上的JDO - @Unowned字段作为空值返回

时间:2013-02-26 02:01:17

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

假设我有一个非常简单,经典的设置:GAE(1.7.4)+ GWT(2.5.0)应用程序,在本地Jetty(开发服务器)上运行,使用JDO进行持久化。

我们还说我只有2个@PersistenceCapable类:Person和Color。每个人都有一个最喜欢的颜色,但这并不意味着这个人拥有这种颜色 - 许多不同的人可以拥有相同的颜色。有许多众所周知的颜色,即使不是任何人的喜爱,也可能存在颜色。

为了对此进行建模,我应该使用@Unowned关系 - 如果我错了,请纠正我:

@PersistenceCapable
public class Color { // just the most regular Entity class

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    String rgb;

    // getter, setter, no constructor
}

@PersistenceCapable
public class Person {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    String surname;

    @Persistent
    @Unowned // here is the tricky part
    Color color;

    // getters, setters, no constructor
}

使用一些简单,众所周知的基于PersistentManager的代码,我能够成功创建并保留Color类的实例。我在GAE开发控制台中看到它 - >数据存储查看器,具有很好的生成键和ID /名称(13),以及我指定的RGB。

使用非常相似的代码,我可以创建Person类的实例(在另一个请求中),将预先存在的Color指定为他最喜欢的颜色(它已经存在,我是通过pm.getObjectById()获得的)并坚持下去。我在数据存储查看器中看到了它,我生成了很好的Key和ID / Name(15)以及我指定的姓氏,color_key_OID是(13)。这看起来很有希望。

但是,当我从DB(简单的pm.getObjectById(),没有事务)中取回Person(15)时,它正确地指定了我的姓氏,但是有null而不是Color(13)!对 - 数据存储区查看器可以正常使用,但我的代码没有。

哦,有问题的代码? “Person p = pm.getObjectById(Person.class,key);”。

(附注:我对@Unowned集合也有同样的问题(数据存储区查看器中值很好的列表,但我的代码中的null Collection字段。)我在类路径上的JDO jar是“datanucleus-api-jdo-3.1 .1.jar“和”jdo-api-3.0.1.jar“所以我假设他们支持@Unowned。没有@Unowned字段没有问题。持久化或获取时没有异常,只有普通的null为字段值。)

4 个答案:

答案 0 :(得分:3)

将颜色标记为“急切获取”

@Persistent(defaultFetchGroup="true")
@Unowned
Color color

或者像这样定义你自己的fetchgroup:

@FetchGroup(name="eager", members={@Persistent(name="color")})
@PersistenceCapable
public class Person {

并在需要时通过指定要提取的组来使用它:

PersistenceManager pm = pmf.getPersistenceManager();
pm.getFetchPlan().addGroup("eager");

答案 1 :(得分:0)

我有同样的问题你所描述的。 DataNucleus如何表示您需要描述对象的整个生命周期。在我的例子中,在使用close()函数关闭PersistenceManager之前,解决了从person对象获取颜色的问题。

记住JDO使用延迟加载技术来获取对象。

答案 2 :(得分:0)

我在一个@Unowned列表中遇到了同样的问题。我有更多的其他两个,完美地获取了数组。

为我解决这个问题的原因是更改了更大的属性名称。在您的情况下,就像将属性名称从“颜色”更改为更大的内容,例如“myfavoritecolor”。

答案 3 :(得分:0)

我能够通过向查询添加获取组而不是持久性管理器来解决此问题。

    PersistenceManager pm = PMF.get().getPersistenceManager();
    logger.info("EVENTS FETCH GROUPS : " + pm.getFetchPlan().getGroups());
    /*pm.getFetchPlan().addGroup("eventFetchGroup");
    pm.getFetchPlan().setMaxFetchDepth(2);*/
    Query q = pm.newQuery(Event.class);
    q.getFetchPlan().addGroup("eventFetchGroup");
    logger.info("EVENTS FETCH GROUPS : " +q.getFetchPlan().getGroups());
    q.setFilter("date >= fromDate && date <= toDate");
    q.declareParameters("java.util.Date fromDate, java.util.Date toDate");