google-app-engine - Gae Jdo 坚持一对多关系与双向导航

标签 google-app-engine navigation jdo bidirectional

我正在尝试使用 JDO 在 GAE 中通过双向导航保持一对多关系。

我手动将 Contact 添加到 User 类,我希望最后 Contact 将引用父级用户 对象。

  • 如果我在保留父级之前手动配置它,我会得到一个 异常:org.datanucleus.store.appengine.DatastoreRelationFieldManager.checkForParentSwitch(DatastoreRelationFieldManager.java:204)
  • User 对象持久化之后,父引用不存在 更新。
  • Contact 对象从 使用 key 的数据存储不会更新父引用。

我不明白我的错误在哪里。

package test;

import java.util.ArrayList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.google.appengine.api.datastore.Key;

public class DatastoreJdoTest extends LocalServiceTestCase {
    @Autowired
    @Qualifier("persistenceManagerFactory")
    PersistenceManagerFactory pmf;

    @Test
    public void testBatchInsert() {
        Key contactKey;
        PersistenceManager pm = pmf.getPersistenceManager();
        try {
            pm.currentTransaction().begin();
            User user = new User();
            Contact contact = new Contact("contact1");
            user.contacts.add(contact);

            /*
             * With this an exception is thrown
             * 
             * Detected attempt to establish User(1)/Contact(2) as the parent of
             * User(1) but the entity identified by User(1) has already been
             * persisted without a parent. A parent cannot be established or
             * changed once an object has been persisted.
             * org.datanucleus.store.appengine.FatalNucleusUserException:
             * Detected attempt to establish User(1)/Contact(2) as the parent of
             * User(1) but the entity identified by User(1) has already been
             * persisted without a parent. A parent cannot be established or
             * changed once an object has been persisted. at
             * org.datanucleus.store
             * .appengine.DatastoreRelationFieldManager.checkForParentSwitch
             * (DatastoreRelationFieldManager.java:204)
             */
            //contact.user = user;
            Assert.assertNull(contact.key);
            pm.makePersistent(user);
            Assert.assertNotNull(contact.key);

            pm.currentTransaction().commit();

            contactKey = contact.key;
            //this assertion is broken. why ? 
            //Assert.assertNotNull(contact.user);
        } finally {
            if (pm.currentTransaction().isActive()) {
                pm.currentTransaction().rollback();
            }
        }
        Contact contact2 = pm.getObjectById(Contact.class, contactKey);
        Assert.assertNotNull(contact2);
        //this assertion is broken. why the contact don't store the parent user ?
        Assert.assertNotNull(contact2.user);
    }
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
class User {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    public Key key;
    @Persistent
    public String name;
    @Persistent
    public List<Contact> contacts = new ArrayList<Contact>();
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
class Contact {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key;
    @Persistent
    public String contact;
    @Persistent(mappedBy = "contacts", dependent = "true")
    public User user;

    public Contact(String contact) {
        this.contact = contact;
    }
}

最佳答案

根据 App Engine docs ,您应该在关系的所有者中指定“mappedBy”。

您可能还想阅读 Max Ross's article或查看 my code从查询中获取的子对象(消息)访问父对象(讨论)

关于google-app-engine - Gae Jdo 坚持一对多关系与双向导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1971031/

相关文章:

java - 生成服务时出现错误请求错误

Android Google App Engine 教程不会工作

银光 3 : No change but now I am getting "Page Not Found"

java - 如何将图标添加到抽屉导航中的项目

jsf - 如何使用导航规则进行重定向

java - GAE+JDO+JAVA+CRUD

java - DataNucleus:提交事务时如何自动执行操作?

java - 多个数据存储操作——我们需要多少个持久化管理器引用?

java - App Engine - 云 SQL - java.sql.SQLException : This Connection is closed

java - 事务内的 JDO 查询 : yes or no?