2013-07-10 101 views
0

我正在使用Google App Engine,並使用關於JDO的Google文檔創建了一個持久實體。該類如下:JDO實體修改不會持久

@PersistenceCapable 
public class Message { 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key key; 

@Persistent 
public long id; 

@Persistent 
public Text message; 

@Persistent 
public boolean isNew; 

@Persistent 
public long categoryId; 

@Persistent 
public boolean plus; 

@Persistent 
public Date lastUpdate; 


Message(long id, String message, boolean isNew, long categoryId, Date lastUpdate, boolean plus) { 
    this.id = id; 
    this.message = new Text(message); 
    this.isNew = isNew; 
    this.categoryId = categoryId; 
    this.lastUpdate = lastUpdate; 
    this.plus = plus; 
} 
} 

而且比,我創建了一個HttpServlet的用下面的doPost代碼:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.setContentType("text/plain"); 
    PrintWriter writer = resp.getWriter(); 
    Date tenDaysAgo = new Date(new Date().getTime()-TEN_DAYS_IN_MILISSECOND); 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 

    try { 
     Query queryMessages = pm.newQuery(Message.class); 
     queryMessages.setFilter("isNew == True && lastUpdate <= lastUpdateParam"); 
     queryMessages.declareParameters(Date.class.getName() + " lastUpdateParam"); 
     List<Message> results = (List<Message>) queryMessages.execute(tenDaysAgo); 
     for(Message msg : results) { 
      msg.isNew = false; 
      pm.makePersistent(msg); 
     } 
     //pm.makePersistentAll(results); 
     writer.print(results.size() + " messages changed."); 
    }finally { 
     pm.close(); 
    } 
} 

但是,當我做一個POST請求我收到消息「3048個信息改變「。我檢查數據庫和數據沒有改變。持久性不能持久化我在對象中所做的更改。即使使用makePersistentAll(list)或makePersistent(object),結果也是一樣的:數據庫沒有變化。

我失蹤了什麼?

謝謝!

+1

使用古老的GAE JDO更可能的,你沒有任何代碼有以確保提交數據(這是不支持與v1.x GAE JDO) – DataNucleus

回答

0

你需要創建一個JDO事務保持變化的軌跡,然後提交它們發佈更新SQL語句:

pm.currentTransaction().begin(); 
    for(Message msg : results) { 
     msg.isNew = false; 
    } 
    pm.currentTransaction().commit(); 
+0

非常感謝您的答案,但這並沒有奏效。我嘗試應用這個沒有任何makePersistent調用,嘗試與makePersistent對象,嘗試與makePersistentAll和沒有任何工作。仍然缺少一些東西 – user2570451

+0

這應該起作用,所以如果沒有更多的信息,恐怕我們無法真正幫助你。請發佈您正在使用的DataNucleus版本和調試日誌輸出 - 請參閱http://www.datanucleus.org/products/accessplatform/logging.html – TheArchitect