Привет всем терпеливым разработчикам, использующим граф данных пружины. Поскольку документации так мало, и охват тестов довольно слаб, иногда очень трудно понять, каково ожидаемое поведение базовой платформы и как она должна работать. В настоящее время у меня есть несколько вопросов, связанных с новым подходом извлечения, введенным в SDG 1.1. В отличие от SDG 1.1, запись \ чтение через 2.0 только отношения и связанный объект, аннотированный аннотацией @Fetch, извлекаются с нетерпением, другие, как предполагается, выбираются лениво ... и теперь мой первый вопрос:
- Можно ли настроить SDG, чтобы при загрузке объекта и
вызов getter для ленивых отношений происходит в той же транзакции,
запрашиваемая коллекция извлекается автоматически? Вид настойчивости
Контекст в области транзакции, или, возможно, это запланировано для функции
релизы.
- Как я могу получить ленивую коллекцию сразу для аннотации @RelatedTo? Метод fetch () от Neo4jOperation позволяет получить только одну сущность. Должен ли я перебирать весь список и извлекать сущность для каждого объекта? Как лучше всего проверить, что данный объект уже получен / инициализирован или нет?
- В качестве рекомендации я думаю, что было бы более интуитивно понятно, если вместо получения NPE при работе с неинициализированными объектами возникнет своего рода отложенное исключение загрузки. Более того, это поведение вводит в заблуждение, поскольку, когда объект не инициализирован и все свойства-члены не равны нулю, кроме id, метод equals может обеспечить значение true для различных объектов, которые не были инициализированы, что является довольно серьезными проблемами, например, для применения наборов
Еще одна проблема, которую я заметил при работе с SDG 2.0.0.RC1, заключается в следующем: когда я добавляю новый объект в коллекцию без выборки, иногда он добавляется и сохраняется должным образом, а иногда - нет. Я написал тест для этого случая, и он работает недетерминированным образом. Иногда это терпит неудачу, иногда заканчивается успехом. Вот пример использования:
Group groupFromDb = neoTemplate.findOne(group.getId(), Group.class);
assertNotNull(groupFromDb);
assertEquals("Number of members must be equals to 1", 1, groupFromDb.getMembers().size());
User secondMember = UserMappingTest.createUser("secondMember");
groupFromDb.addMember(secondMember);
neoTemplate.save(groupFromDb);
Group groupAfterChange = neoTemplate.findOne(groupFromDb.getId(), Group.class);
assertNotNull(groupAfterChange);
assertEquals("Number of members must be equals to saved entity", groupFromDb.getMembers().size(), groupAfterChange.getMembers().size());
assertEquals("Number of members must be equals to 2", 2, groupAfterChange.getMembers().size());
Этот тест иногда завершается неудачно при последнем утверждении, что означает, что иногда член добавляется в набор, а иногда нет. Я предполагаю, что проблема лежит где-то в ManagedFieldAccessorSet, но это трудно сказать, так как это не является детерминированным. Я запускаю тест с mvn2 и mvn3 с java 1.6_22 и 1.6_27, и я всегда получаю один и тот же результат: иногда все в порядке, иногда тест не проходит. Реализация User equals выглядит следующим образом:
@Override
public boolean equals(final Object other) {
if ( !(other instanceof User) ) {
return false;
}
User castOther = (User) other;
if(castOther.getId() == this.getId()) {
return true;
}
return new EqualsBuilder().append(username, castOther.username).isEquals();
}
- Мне также немного проблематично, что для объектов, аннотированных @Fetch, используется java HashSet, который является сериализуемым, в то время как при использовании ленивых загруженных полей используется ManagedFieldAccessorSet, который не сериализуем и вызывает не сериализуемое исключение.
Любая помощь или совет приветствуются. Заранее спасибо!