2013-07-10 4 views
0

Google App Engine을 사용하고 있으며 JDO에 관한 Google 문서를 사용하여 영구 엔티티를 만들었습니다. 3048 메시지가 변경JDO 엔티티 수정이 지속되지 않습니다.

@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 요청을 할 때이 메시지가 "가 나타납니다

@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 코드 생성 : 클래스는 다음과 같다 . " 데이터베이스를 확인하고 데이터는 변경되지 않습니다. 지속성은 객체에서 변경 한 내용을 유지하기 위해 작동하지 않습니다. makePersistentAll (list) 또는 makePersistent (object)를 사용하더라도 결과는 동일하지만 데이터베이스가 변경되지는 않습니다.

내가 무엇이 누락 되었습니까?

감사합니다.

+1

가능성보다는 고대 GAE JDO를 사용하여, 당신은이 코드가없는 데이터 커밋을 보장합니다 (v1.x GAE JDO에서 지원되지 않음) – DataNucleus

답변

0

당신은 업데이트 SQL 문을 발행 할 변경 내용을 추적하고이를 저지하기 위해 JDO 트랜잭션을 만들어야합니다

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