2013-03-20 48 views
0

是這個樣子我有域對象:查詢不相同的交易,即可找到持久對象

@PersistenceCapable(detachable="true") 
public class UserData implements java.io.Serializable 
{ 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    @NotNull 
    private String openId; 

    public UserData(String openId) 
    { 
     this.openId = openId; 
    } 
} 

現在我創建的UserData對象並使用使其持久JDO:

UserData userData = ThreadLocalPMF.getPersistenceManager().makePersistent(new UserData(openId)); 

稍後在代碼中,我使用相同的PersistenceManager,同一線程在相同的仍處於打開狀態的事務中執行查詢:

Query query = ThreadLocalPMF.getPersistenceManager().newQuery(UserData.class, "openId == :openId"); 
query.setUnique(true); 
UserData userData = (UserData)query.execute(openId); 

現在它發生了一次,查詢確實返回null,而不是先前持久化了一些代碼行的對象。這裏有什麼問題?這是一致性問題嗎?該應用程序是使用高複製數據存儲與

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/> 

回答

0

當堅持用id變量標有對象:

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 

我不是100%肯定,此刻它會保存一個對象提供的ID。但我認爲它會將對象保存爲一個完全不同的ID值,因爲它跟在valueStrategy之後。

若要修復該問題,保存對象後,在從方法返回之前獲取它的ID,並保留該ID以便稍後查找該對象。

0

在GAE事務中,事務內的所有查詢都會在事務啓動時看到數據存儲狀態的快照。查詢不會返回在事務中被修改的任何新的或更新的實體,您必須自己跟蹤。

你應該回到交易查詢的文件中去獲得更多的細節。