我正在与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。
答案 0 :(得分:1)
Map<String, ?>
类型的字段存储在低级api中,类型为EmbeddedEntity
,这是唯一可用作属性的类似地图的结构。此EmbeddedEntity
是作为非关联HashMap
实施的。因此,Objectify无法保持秩序。
我将在Objectify的文档中记下这一点。如果您希望更改此行为,请在GAE的问题跟踪器中打开一个问题,请求“Entity和EmbeddedEntity应使用LinkedHashMap来保留顺序”。