我試圖發展: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行)。
很明顯,日誌會告訴你實際發生的數據存儲。我個人會參考它,相對於你對em.persist和em.close的調用來說。 – DataNucleus 2013-03-22 07:48:23
@DataNucleus我的日誌很棒。全部新記錄成功插入。它只是我的頁面上的列表沒有立即更新。 – 2013-03-22 07:51:59