使用objectify存储和加载实体会返回不同的结果

时间:2016-09-06 21:17:22

标签: java google-app-engine objectify

我正在学习以物化方式存储和加载数据。我写了下面的实体类:

<select class="form-control" id="exampleSelect1" [(ngModel)]="selectedValue" (change)="getSingleCategory()">
    <option *ngFor="let category of ServerCategorys" [value]="category">{{category?.CategoryName}}</option>
</select>

export class AddComponent {
    selectedValue = null;
    // ...
}

用于测试我写了一个删除我之前保存的所有类型的实体的方法:

@Entity
public class Contact {

    public Contact(){}

    @Id
    public Long id;
    public String name;

    public Contact(String name) {
        this.name = name;
    }
}

在方法结束时,我再次创建相同类型的新实体:

List<Key<Contact>> keys = ObjectifyService.ofy().load().type(Contact.class).keys().list();
ObjectifyService.ofy().delete().keys(keys).now();

关于这一点的奇怪之处在于,每次重新运行此代码时,我都会获得不同数量的结果(从3-5个返回的联系人实体中变化):

Contact contact1 = new Contact("name1");       
ObjectifyService.ofy().save().entity(contact1).now();
Contact contact2 = new Contact("name2");       
ObjectifyService.ofy().save().entity(contact2).now();
Contact contact3 = new Contact("name3");       
ObjectifyService.ofy().save().entity(contact3).now();
Contact contact4 = new Contact("name4");       
ObjectifyService.ofy().save().entity(contact4).now();
Contact contact5 = new Contact("name5");       
ObjectifyService.ofy().save().entity(contact5).now();

那么在我重新运行代码之后,为了彻底解决我所有5个已保存的联系人实体,我应该改变什么呢?

1 个答案:

答案 0 :(得分:1)

因为您正在查询所创建的对象,所以您看到的行为是“最终的一致性”。实际上正在创建对象,在它们可用之前只有一个延迟。您可以阅读有关最终一致性以及如何避免它的更多信息here。作为一般规则,当您不需要强一致性时,最好是最终解决。

开发环境中的本地数据存储区为您模拟最终的一致性。可以根据记录here进行调整。