java - JDO - 更新一对一的 child

标签 java google-app-engine jdo

我有一个食谱。每个食谱都有一个图像。所以我的实体看起来像

@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/

相关文章:

java - 如何在 Hadoop 1.0.4 中链接映射器/ reducer ?

java - 在 Websphere 中的什么位置放置数据文件?

google-app-engine - python google app engine更新失败

java - 使用 PersistenceManager 删除对象时出现问题

java - java中使用非阻塞I/O发送消息(NIO API)

java - 为什么不从下一个 JVM 中删除类型删除?

python - 我们如何忽略 NDB 缓存的查询结果?

java - 在 Google App Engine 上返回空列表在开发服务器上和部署时的行为有所不同

java - JDO 处理唯一约束冲突

java - 日期查询不适用于 Google App Engine Java