2015-01-28 1 views
0

Я работаю с Objectify для доступа к DataStore в приложении приложения Google App Engine.[GAE - Objectify]: LinkedHashMap не поддерживает заказ ключа

У меня 2 Entities:

@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, я заметил, что элементы находится в точно обратном порядке.

Например, если я добавить 2 клиентов в LinkedHashMap и сохранить его, как это:

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?

Заранее спасибо. Cheers, Alessandro.

+0

[LinkedHashMap] (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html) Хэш-таблица и связанный список реализации интерфейса карты с предсказуемым порядком итерации. Эта реализация отличается от HashMap тем, что она поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки). – mancioshell

ответ

1

Поля типа Map<String, ?> хранятся на низком уровне api, как тип EmbeddedEntity, единственная карта-подобная структура, доступная как собственность. Этот EmbeddedEntity реализован как несвязанный HashMap. Следовательно, для Objectify не существует способа сохранить порядок.

Я сделаю это в документации Objectify. Если вы хотите, чтобы это поведение изменилось, откройте проблему в журнале отслеживания проблем GAE с запросом «Entity и EmbeddedEntity должны использовать LinkedHashMap для сохранения порядка».