我有一个食谱。每个食谱都有一个图像。所以我的实体看起来像
@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:我会尝试在设置 myImageB
之前显式地删除 myImageA
。这会破坏对 myImageA
的所有其他引用,但如果您希望从其他上下文中使用它,那么拥有关系无论如何都是不合适的。
这种令人困惑的混淆是我完全放弃 JDO 和拥有关系并学会爱上 Objectify 的原因。它们还限制了您对实体组的选择,这增加了迷雾的另一个维度。
关于java - JDO - 更新一对一的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582187/