2014-12-08 53 views
0

我使用我的数据存储实体来存储int值number = 0。在添加函数中,我使用了count = number ++。但是第一次应用程序推到GAE,它显示0.然后它从1开始。所以我改变为int数= 10,即使我得到的值是零,但数据存储存储为10.我怎样才能获得更新的值在Java页面插入记录后?当我尝试获取当前值时,它显示为零,但在数据存储中,它存储为10.请帮我解决此问题。如何获得价值10这只发生在部署和首张罚单的第一次才把它显示正确的值(迭代器值)Datastore中的自定义迭代器使用JAVA显示零

感谢

这里我的代码

@Entity 
public class Ticket { 

    //static int nextID = 17; 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     private Long id; 
     private String title; 
     private Text description; 
     static int nextID = 10; 
     private int current; 


     public Ticket(String title, Text description) { 
      current = nextID++; 
      this.title = title; 
      this.priority = priority; 
      this.description = description; 
} 

回答

2

谷歌云平台有多个数据中心,并且它们并不总是保持相同记录的相同状态。如果您在增加值后立即查询该值,则尤其如此。您可以使用祖先查询来检索实体,这将使其更新和一致。详情请看文章[1]。

这里是与祖先查询[2]的链接。这个想法是,当您使用祖先查询时,它强制查询在所有更改完成后(针对该查询)返回数据。这确保了最新的强一致性。

[1] - https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

[2] - https://cloud.google.com/appengine/docs/java/datastore/queries#Java_Ancestor_queries

=== --- ===示例(从I提供的第二链路)

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

Entity tom = new Entity("Person", "Tom"); 
Key tomKey = tom.getKey(); 
datastore.put(tom); 


Entity weddingPhoto = new Entity("Photo", tomKey); 
weddingPhoto.setProperty("imageURL", 
         "http://domain.com/some/path/to/wedding_photo.jpg"); 

Entity babyPhoto = new Entity("Photo", tomKey); 
babyPhoto.setProperty("imageURL", 
         "http://domain.com/some/path/to/baby_photo.jpg"); 

Entity dancePhoto = new Entity("Photo", tomKey); 
dancePhoto.setProperty("imageURL", 
         "http://domain.com/some/path/to/dance_photo.jpg"); 

Entity campingPhoto = new Entity("Photo"); 
campingPhoto.setProperty("imageURL", 
         "http://domain.com/some/path/to/camping_photo.jpg"); 

List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto, 
             dancePhoto, campingPhoto); 
datastore.put(photoList); 


Query photoQuery = new Query("Photo") 
         .setAncestor(tomKey); 


// This returns weddingPhoto, babyPhoto, and dancePhoto, 
// but not campingPhoto, because tom is not an ancestor 
List<Entity> results = datastore.prepare(photoQuery) 
           .asList(FetchOptions.Builder.withDefaults()); 

=== --- === 看到这些部分:

Entity weddingPhoto = new Entity(“Photo”,tomKey);

Entity dancePhoto = new Entity(“Photo”,tomKey);

这生成一个具有祖先密钥“tomKey”的实体。

现在实体保存到数据存储:

List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto, 
              dancePhoto, campingPhoto); 
datastore.put(photoList); 

当你需要获取结果,执行特殊查询:

Query photoQuery = new Query("Photo") 
          .setAncestor(tomKey); 

这确保了photoQuery不只是一个随机的查询针对任何随机数据中心提取任何数据;它确保它从数据存储中获取最新的数据。

+0

我是使用java的GAE的新人。我不能理解祖先查询。请用例子来解释。我正在使用DAO和javax.persistence.Query。使用此示例 – 2014-12-10 06:50:12

+0

请使用祖先查询的数据存储查询方法(如示例所示)。 这个想法是,当你提供一个祖先密钥给一个实体,然后再使用祖先密钥进行查询时。它将返回实体的最新版本。 – 2014-12-10 17:24:16

+0

好的谢谢你给的例子。我不问主键。我将创建自定义迭代器。它是否有助于自定义迭代器? – 2014-12-11 05:35:54