私は使用して開発しようとしています:
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
作成された名前5desc5の世話をしますが、リストサイズはまだ4です(5行である必要があります)。そして、別の行を挿入すると、再び正常に機能します(6行)。