Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine GAE上的JDO-@Unowned字段返回为空_Google App Engine_Gwt_Google Cloud Datastore_Jdo - Fatal编程技术网

Google app engine GAE上的JDO-@Unowned字段返回为空

Google app engine GAE上的JDO-@Unowned字段返回为空,google-app-engine,gwt,google-cloud-datastore,jdo,Google App Engine,Gwt,Google Cloud Datastore,Jdo,假设我有一个非常简单的经典设置:GAE(1.7.4)+GWT(2.5.0)应用程序,运行在本地Jetty(开发服务器)上,使用JDO进行持久化 假设我只有2个@PersistenceCapable类:Person和Color。每个人都有一种最喜欢的颜色,但这并不意味着这个人拥有这种颜色——许多不同的人可以拥有相同的最喜欢的颜色。众所周知的颜色数量有限,即使不是任何人喜欢的颜色,也可能存在 要对此进行建模,我应该使用@Unowned relationship-如果我错了,请纠正我: @Persis

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

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

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

@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开发控制台->数据存储查看器中看到了它,它有很好的生成键和(13)的ID/名称,以及我分配的RGB

使用非常类似的代码,我能够创建Person类的实例(在另一个请求中),分配一个预先存在的颜色作为他最喜欢的颜色(它是预先存在的,我是通过pm.getObjectById()获得的),并将其持久化。我在datastoreviewer中看到它,我的nice生成键和ID/Name为(15),分配的姓氏为(13)。这看起来很有希望

但是,当我从数据库(simple pm.getObjectById(),no transactions)中取回Person(15)时,它正确地拥有我指定的姓氏,但使用null而不是Color(13)!右-数据存储查看器可以,但我的代码不能

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


(旁注:我在@Unowned collections(数据存储查看器中的值列表很好,但代码中的集合字段为空)方面也有同样的问题。我在类路径上的JDO jar是“datanucleus-api-JDO-3.1.1.jar”和“JDO-api-3.0.1.jar”因此,我假设它们支持@Unowned。not-@Unowned字段没有问题。我在持久化或获取时没有异常,只有纯空值作为字段值。)

我与您描述的问题相同。DataNucleus如何描述对象的整个生命周期。在我的例子中,在使用close()函数关闭PersistenceManager之前,通过强制从person对象获取颜色解决了这个问题


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

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

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

@FetchGroup(name="eager", members={@Persistent(name="color")})
@PersistenceCapable
public class Person {
并在需要时通过指定要提取的组来使用它:

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

在我的一张“无主”名单上,我也面临着同样的问题。我还有另外两个,数组的获取非常完美


对我来说,解决这个问题的办法是把房产的名字改成一个更大的名字。在您的情况下,就像将属性名称从“color”更改为更大的名称,如“myfavoritecolor”。

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

    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");
PersistenceManager pm=PMF.get().getPersistenceManager();
info(“事件获取组:+pm.getFetchPlan().getGroups());
/*pm.getFetchPlan().addGroup(“eventFetchGroup”);
pm.getFetchPlan().setMaxFetchDepth(2)*/
Query q=pm.newQuery(Event.class);
q、 getFetchPlan().addGroup(“eventFetchGroup”);
info(“事件获取组:+q.getFetchPlan().getGroups());

q、 设置过滤器("date>=fromDate&&date datanucleus api jdo和jdo api与Unowned无关。Unowned是一个仅适用于GAE的概念。显然,jdo规范定义它将只加载当时在获取计划中的字段,而不提供获取它们的方式以及它们当时处于的生命周期状态的代码。您是否使用gwt request工厂或gwt rpc?如果您使用的是请求工厂,则可以将.with(“color”)添加到请求上下文中,它将在对象上调用getColor。我专门为此使用requestfactory。
    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");