[GAE - Objectify]:LinkedHashMap不尊重键的顺序

时间:2015-01-28 09:18:58

标签: google-app-engine objectify linkedhashmap

我正在与Objectify合作,在Google App Engine应用程序中访问DataStore。

我有2个实体:

@Entity
public class Client {
    @Id String id;
}

@Entity
public class Queue {
    @Index @Id String name;     
    @Load LinkedHashMap<String,Ref<Client>> clientsInQueue;
}

在交易中,我做这样的事情:

Client newClient = new Client(...);
ofy().save().entity(newClient);

Queue selectedQueue = ofy().load().type(Queue.class).id(queueName).now();
selectedQueue.getClientsInQueue().put(newClient.getId(), Ref.create(newClient));

但是当我尝试打印LinkedHashMap中的所有元素时,我注意到元素完全按反向顺序。

例如,如果我在LinkedHashMap中添加2个客户端并保存它,如下所示:

Queue selectedQueue = new LinkedHashMap<String,Ref<Client>>();
String id1 = "id1";
Client c1 = new Client(id1);
ofy().save().entity(c1);    
String id2 = "id2"
Client c2 = new Client(id2);
ofy().save().entity(c2);    

selectedQueue.getClientsInQueue().put(c1.getId(), Ref.create(c1)); 
selectedQueue.getClientsInQueue().put(c2.getId(), Ref.create(c2));
ofy().save().entity(selectedQueue); 

Set<String> keys = selectedQueue.getClientsInQueue().keySet();

for(String key : keys){
    Client c= selectedQueue.getClientsInQueue().get(key).get();
    log.info("id: "+c.getId());
}

结果是:

id:id2

id:id1

为什么我会获得这种行为?我知道LinkedHashMap必须保持键的顺序!将LinkedHashMap与GAE DataStore一起使用有什么问题吗?

提前致谢。 干杯, 的Alessandro。

1 个答案:

答案 0 :(得分:1)

Map<String, ?>类型的字段存储在低级api中,类型为EmbeddedEntity,这是唯一可用作属性的类似地图的结构。此EmbeddedEntity是作为非关联HashMap实施的。因此,Objectify无法保持秩序。

我将在Objectify的文档中记下这一点。如果您希望更改此行为,请在GAE的问题跟踪器中打开一个问题,请求“Entity和EmbeddedEntity应使用LinkedHashMap来保留顺序”。