在Google App Engine数据存储中更新查询(Java)

3

如何在使用GWT时在Google App Engine中使用更新查询。我正在尝试制作一个聊天应用程序,管理员可以编辑现有消息的部分,除了提交和删除以前的消息。

为了编辑现有的消息,需要使用更新查询,但我无法在数据存储中找到类似于更新查询的内容。

我们如何更新现有数据?


GWT的使用有什么相关性吗? 我的回答中理解了这个问题吗?如果没有,我们能指引对方走向正确的方向吗? - Romain Hippeau
2个回答

2

下面是来自http://www.ibm.com/developerworks/java/library/j-gaej3.html的示例代码:

您可以进行“get”操作修改数据,然后进行“make persistent”操作并提交。

请参见附带代码中的updateContact()方法。

主要注意事项是跨实体进行此操作 - 注意:DataStore中的数据存储不同于关系数据库。

package gaej.example.contact.server;

import gaej.example.contact.client.Contact;

import java.util.List;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;

public class ContactJdoDAO implements ContactDAO {
    private static final PersistenceManagerFactory pmfInstance = JDOHelper
            .getPersistenceManagerFactory("transactions-optional");

    public static PersistenceManagerFactory getPersistenceManagerFactory() {
        return pmfInstance;
    }

    public void addContact(Contact contact) {
        PersistenceManager pm = getPersistenceManagerFactory()
                .getPersistenceManager();
        try {
            pm.makePersistent(contact);
        } finally {
            pm.close();
        }
    }

    @SuppressWarnings("unchecked")
    public List<Contact> listContacts() {
        PersistenceManager pm = getPersistenceManagerFactory()
                .getPersistenceManager();
        String query = "select from " + Contact.class.getName();
        return (List<Contact>) pm.newQuery(query).execute();
    }

    public void removeContact(Contact contact) {
        PersistenceManager pm = getPersistenceManagerFactory()
                .getPersistenceManager();
        try {
            pm.currentTransaction().begin();

            // We don't have a reference to the selected Product.
            // So we have to look it up first,
            contact = pm.getObjectById(Contact.class, contact.getId());
            pm.deletePersistent(contact);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public void updateContact(Contact contact) {
        PersistenceManager pm = getPersistenceManagerFactory()
                .getPersistenceManager();
        String name = contact.getName();
        String phone = contact.getPhone();
        String email = contact.getEmail();

        try {
            pm.currentTransaction().begin();
            // We don't have a reference to the selected Product.
            // So we have to look it up first,
            contact = pm.getObjectById(Contact.class, contact.getId());
            contact.setName(name);
            contact.setPhone(phone);
            contact.setEmail(email);
            pm.makePersistent(contact);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

}

1

在一个已被检索或之前插入的实体上调用makePersistent()将会更新数据存储中的实体。请参阅文档


那么 pm.refresh(Object o) 有什么用呢?我以为这是 App Engine 中 JDO 的“更新”函数。(至少它有效) - dayscott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接