假设我有一个非常简单,经典的设置: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为字段值。)
答案 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");