我正在尝试使用Java和JDO构建一个简单的Google App Engine应用程序。
我的应用程序创建Sale对象并将其持久化到数据存储器中,一旦持久化,我尝试使用查询列出数据存储器中的所有Sales。
然而,有时列表会缺少最后持久化的一两个Sales,刷新浏览器几次最终会使所有的Sales都被列出。
即使我每隔3秒钟点击一次“添加销售”按钮,也不能保证从查询中检索到所有已持久化的Sales。
必须有一种方法来确保查询返回所有Sales,我尝试过使用事务,但没有成功,可能是我使用方法不对,希望得到任何建议。
这是我的Sale对象:
这是我的实用类:
这是我的主页:
我的应用程序创建Sale对象并将其持久化到数据存储器中,一旦持久化,我尝试使用查询列出数据存储器中的所有Sales。
然而,有时列表会缺少最后持久化的一两个Sales,刷新浏览器几次最终会使所有的Sales都被列出。
即使我每隔3秒钟点击一次“添加销售”按钮,也不能保证从查询中检索到所有已持久化的Sales。
必须有一种方法来确保查询返回所有Sales,我尝试过使用事务,但没有成功,可能是我使用方法不对,希望得到任何建议。
这是我的Sale对象:
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
@PersistenceCapable(detachable="true")
public class Sale {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String title;
@Persistent
private Date valuationDate;
public Sale(){
}
//getters and setters
这是我的实用类:
public class SaleUtil {
public static void addSale(){
PersistenceManager pm = PMF.get().getPersistenceManager();
Sale s = new Sale();
s.setTitle("new sale");
s.setValuationDate(new Date());
try{
pm.makePersistent(s);
} catch (Exception e){
System.out.println(e);
} finally {
pm.close();
}
}
public static List<Sale> getSales(){
List<Sale> sales = new ArrayList<Sale>();
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(Sale.class);
query.setOrdering("valuationDate desc");
try{
List<Sale> results = (List<Sale>)query.execute();
if(!results.isEmpty()){
for(Sale s: results){
Sale detached = pm.detachCopy(s);
sales.add(detached);
}
}
} catch (Exception e){
System.out.println(e);
} finally {
query.closeAll();
pm.close();
}
return sales;
}
}
这是我的主页:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.List" %>
<%@ page import="javax.jdo.PersistenceManager" %>
<%@ page import="javax.jdo.Query" %>
<%@ page import="com.grc.tradesharx.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="/tradesharx" method="post">
<input type="submit" value="add sale"/>
</form>
<%
List<Sale> sales = SaleUtil.getSales();
out.println(sales.size()+"<br/>");
for(Sale s : sales){
out.println(s+"<br/>");
}
%>
</body>
</html>
这是我的servlet:
package com.grc.tradesharx;
import java.io.IOException;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class TradeSharxServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
SaleUtil.addSale();
resp.sendRedirect("index.jsp");
}
}
请帮我,我知道我漏了什么。