【问题标题】:JPA + GAE -> insert not immediately update datastoreJPA + GAE -> 插入不立即更新数据存储
【发布时间】:2013-03-22 07:40:01
【问题描述】:

我尝试使用:

Google App Engine
Data Store 
JPA 
Spring Framework

我为列出客户做了一个页面。在该列表下方,我制作了一个表格来插入新客户。

Customer List 
<table>
    <c:forEach items="${listCustomer}" var="customer" varStatus="status">
        <tr>
            <td>${customer.id}</td>
            <td>${customer.name}</td>
            <td>${customer.desc}</td>

        </tr>
    </c:forEach>
</table>
New Customer    
<form:form action="add" commandName="customer"
    methodParam="POST">
    <form:input path="name"/>
    <form:input path="desc"/>
    <input type="submit" value="Add" />
</form:form>

控制器:

@RequestMapping(value="/list", method = RequestMethod.GET)
public String list( ModelMap model) {
    List<Customer> list=CustomerDAO.INSTANCE.listCustomers();
    model.addAttribute("listCustomer",list);
    return "customer";

}

@RequestMapping(value="/add", method = RequestMethod.POST)
public String add( ModelMap model, Customer form) {
    CustomerDAO.INSTANCE.add(form.getName(),form.getDesc());
    List<Customer> list=CustomerDAO.INSTANCE.listCustomers();
    model.addAttribute("listCustomer",list);
    model.addAttribute("customer",new Customer());
    return "customer";
}

客户DAO

public enum CustomerDAO {
INSTANCE;

  public List<Customer> listCustomers() {
    EntityManager em = EMFService.get().createEntityManager();
    // Read the existing entries
    Query q = em.createQuery("select c from Customer c");
    List<Customer> customers = q.getResultList();
    System.out.println("size : "+customers.size());
    return customers;
  }

  public void add( String name, String desc) {
    synchronized (this) {
      System.out.println("CUSTOMERDAO::add");   
      EntityManager em = EMFService.get().createEntityManager();
      Customer customer = new Customer();
      //customer.setId(new Key());
      customer.setName(name);
      customer.setDesc(desc);
      em.persist(customer);
      System.out.println("name "+ name +" desc "+desc+" created");
      em.close();
    }
  }
//another function
}

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

<persistence-unit name="transactions-daniel">
    <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
    <properties>
        <property name="datanucleus.NontransactionalRead" value="true"/>
        <property name="datanucleus.NontransactionalWrite" value="true"/>
        <property name="datanucleus.ConnectionURL" value="appengine"/>
    </properties>
</persistence-unit>

它实际上工作正常,但问题有时(间歇性)当我插入新客户时,它不会立即更新客户列表,我需要刷新页面以确保我的新记录是否成功插入。我检查了我的数据存储管理页面并在那里获得了我的新记录。

--更新 我每次调用 listCustomers 时都尝试打印大小,这证明它没有立即插入:

CUSTOMERDAO::add
name 4 desc 44 created
size : 4
CUSTOMERDAO::add
name 5 desc 5 created
size : 4
CUSTOMERDAO::add
name 6 desc 6 created
size : 6

查看名称 5 desc 5 创建后,列表大小仍为 4(应为 5 行)。当我插入另一行时,它再次正常工作(6行)。

【问题讨论】:

  • 很明显,日志会告诉您数据存储区实际发生的情况。我个人会参考它,相对于您调用 em.persist 和 em.close 的位置。
  • @DataNucleus 我的日志效果很好。已成功插入所有新记录。它只是我在页面上的列表没有立即更新。

标签: java google-app-engine jpa google-cloud-datastore


【解决方案1】:

这是因为高复制数据存储的最终一致性。请阅读这篇文章: https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency

解决方法是在 Customer 对象上有父键并使用该祖先键进行查询,或者传递新添加的对象的信息并显示它。

【讨论】:

  • 您好,您有示例代码如何使用 Java JPA 使用祖先键吗?您的意思是创建另一个包含客户列表的模型类吗?
  • 抱歉,我现在没有样品。希望我能在一两周内为其编写示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2012-06-06
相关资源
最近更新 更多