2013-03-22 57 views
1

我試圖發展:JPA + GAE - >使用INSERT無法立即更新數據存儲

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"; 
} 

CustomerDAO

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> 

它實際上工作正常,但問題是有時(間歇),當我插入新的客戶,它不立即更新客戶名單,我需要刷新頁面,以確保如果我的新記錄成功插入。我檢查了我的數據存儲管理頁面,並在那裏獲得了我的新記錄。

--update 我嘗試每次我打電話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遞減5創建後的樣子,名單人數仍然4(應是5行)。當我插入另一行時,它再次正常工作(6行)。

+0

很明顯,日誌會告訴你實際發生的數據存儲。我個人會參考它,相對於你對em.persist和em.close的調用來說。 – DataNucleus 2013-03-22 07:48:23

+0

@DataNucleus我的日誌很棒。全部新記錄成功插入。它只是我的頁面上的列表沒有立即更新。 – 2013-03-22 07:51:59

回答

1

這是因爲高複製數據存儲的最終一致性質。請閱讀此文章: https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency

解決方法是在Customer對象上具有父鍵,並使用該祖先鍵進行查詢,或者傳遞新添加的對象的信息並顯示它。

+0

你好你有代碼示例如何使用Java JPA的祖先密鑰?你是否想要創建另一個包含客戶列表的模型類? – 2013-03-22 09:36:00

+0

對不起,我現在沒有任何樣品。希望我能在一兩週內爲它寫樣本。 – 2013-03-24 06:47:36