2013-07-10 2 views
0

Я использую Google App Engine, и я создал постоянный объект, использующий документацию Google о JDO. Класс состоит в следующем: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(); 
    } 
} 

Но, когда я делаю пост запроса я получаю сообщение «изменило 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

Смежные вопросы