Получить аннотацию в SDG 2.0, получить вопросы о стратегии
Привет всем терпеливым разработчикам, использующим весенний график данных. Так как документации так мало, и тестирование достаточно слабое, иногда очень трудно понять, каково ожидаемое поведение базовой платформы и как она должна работать. В настоящее время у меня есть несколько вопросов, связанных с новым подходом извлечения, введенным в SDG 1.1. В отличие от SDG 1.1, запись \ чтение через 2.0 только отношения и связанный объект, аннотированный аннотацией @Fetch, извлекаются с нетерпением, другие, как предполагается, выбираются лениво... и теперь мой первый вопрос:
- Можно ли настроить SDG таким образом, чтобы, если загрузка объекта и вызов геттера по отложенному отношению происходили в одной и той же транзакции, запрашиваемая коллекция извлекается автоматически? Вид постоянства Контекст в области транзакции, или, может быть, он запланирован для выпусков функций.
- Как я могу получить ленивую коллекцию сразу для аннотации @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, который не сериализуем и вызывает не сериализуемое исключение.
Любая помощь или совет приветствуются. Заранее спасибо!
2 ответа
Подход простого сопоставления был добавлен только в Spring Data Neo4j 2.0, поэтому он не так совершенен, как расширенное сопоставление AspectJ. В настоящее время мы работаем над более подробным документированием.
Опция отложенной загрузки также была добавлена в последнее время. Так что ваши отзывы очень приветствуются.
В настоящее время SDN не использует прокси-подход для лениво загруженных объектов. Таким образом, автоматическое извлечение при доступе (пока) не поддерживается. Вот почему также не генерируется исключение при доступе к незагруженным полям, и нет способа "обнаружить", если объект был загружен не полностью.
В текущем снимке есть template.fetch()
операция для полной загрузки ленивых загруженных объектов и коллекций.
Мы рассмотрим проблему HashSet и ManagedSet, это правильно, что это не хорошее решение.
Для теста. getId() возвращает Long
объект или long
примитивный? Это может быть разумно использовать getId().equals(castOther.getId())
здесь в качестве ссылки равенство не гарантируется для Number
объекты.
Я собрал небольшой пример кода, показывающий, как использовать технику fetch(), которую описывает Майкл:
http://springinpractice.com/2011/12/28/initializing-lazy-loaded-collections-with-spring-data-neo4j/