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