Опитвам се да напиша приложение за google app engine с помощта на Objectify и имам известен проблем. Аз съм нов в noSQL хранилищата за данни, така че това вероятно е концептуален проблем.
Имам обект, наречен съобщение, и всяко съобщение има от потребител - потребителят, който е създал съобщението.
@Entity
public class Message {
@Index private Key<User> fromUserKey;
@IgnoreSave private User fromUser;
Досадно е, че трябва да имам поле за потребител и ключ в съобщението. JSON се нуждае от потребителския обект, за да попълни отговора с полезни полета, а механизмът на приложението на google се нуждае от ключа, за да може да съхранява препратката към потребителя. Анотацията @IgnoreSave се използва, за да спре Objectify да иска от двигателя на приложението на Google да се опита да съхрани потребителския обект (което ще се провали).
При извличане на съобщения ключът от потребител се попълва, но обектът от потребител не е. Ето как изглежда DAO кодът за моята операция "getMessages":
public static List<Message> getSentMessages(long userId) {
List<Message> result;
result= ofy().load().type(Message.class).filter("from", Key.create(User.class, userId)).limit(1000).list();
return result;
}
Но обектът fromUser не се попълва във всяко съобщение, а само fromUserKey. Как да получа действителния потребителски обект, попълнен в отговора? Имам нужда от достъп до такива полета като име, фамилия и т.н. - не само ID на потребителя. Мога да получа from User от DB, да прегледам резултатите, след това да извикам setFromUSer за всяко съобщение, но е грозно. И също така причинява ConcurrentModificationException...
Сигурен съм, че правя нещо нередно тук, но не мога да разбера какво.