我有食谱。每个食谱都有一张图片。所以我的实体看起来像
@PersistenceCapable
public class Recipe {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private MyImage myImage;
第一次创建配方时,效果很好,图像是
以及添加,我可以查看它。但是当我去更新它
如
PersistenceManager pm = PMF.get().getPersistenceManager();
Recipe r = pm.getObjectById(Recipe.class, recKey);
try {
r.setImage(newImage);
} finally {
pm.close();
}
新图像将添加到数据存储中,但是当我尝试获取它时
从食谱中,食谱仍然指向我的旧图片
数据存储。这正常吗?我怎样才能解决这个问题?
这是我的jdoconfig.xml文件的内容
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
</persistence-manager-factory>
</jdoconfig>
最佳答案
我认为JDO的AppEngine实现以父键的形式存储拥有的关系。当您将myImageA设置为recipe1的子级时,appengine会将MyImage实体的父级设置为recipe1。
我不是这方面的专家,但是我猜想,当您将myImageB设为recipe1的子级时,appengine会将另一个MyImage实体的父级设置为recipe1。当检索myImage
时,它会寻找带有recipe1
父级的图像,并且即使myImageA
仍然坐在那里,仍会找到myImageB
。
同样,我猜。我希望有一个“提交猜测”选项。
TL; DR :在设置myImageA
之前,我会尝试明确删除myImageB
。这会破坏对myImageA
的所有其他引用,但是如果您希望从其他上下文中使用它,那么无论如何,拥有关系是不合适的。
这种令人困惑的混淆是为什么我完全放弃JDO和拥有的关系并学会了爱Objectify的原因。它们还会限制您对实体组的选择,这增加了雾的另一个维度。