2013-08-25 4 views
0

У меня есть простое соотношение (счета) - [IdentifiedBy] -> (идентичность), определяемое как этотSpringData свойства Neo4j узел не заселенно

@RelatedTo(type = "IDENTIFIED_BY", direction = Direction.OUTGOING) 
private Set<Identity> identities = new HashSet<Identity>(); 

Когда я загружаю счет и получить доступ к его личности, все тождества загружаются, но все их свойства, кроме ID, являются нулевыми. Однако, если я аннотирую свойство с помощью @Fetch, то тождества загружаются правильно, со всеми свойствами. Это по дизайну или я чего-то не хватает?

@NodeEntity 
public class Account { 
    @GraphId Long nodeId; 

    @RelatedTo(type = "IDENTIFIED_BY", direction = Direction.OUTGOING) 
    //@Fetch 
    private Set<Identity> identities = new HashSet<Identity>(); 

    public Set<Identity> getIdentities() { 
     return identities; 
    } 

    public void setIdentities(Set<Identity> identities) { 
     this.identities = identities; 
    } 
} 

@NodeEntity 
public class Identity { 
    @GraphId Long nodeId; 

    private String identifier; 

    public String getIdentifier() { 
     return identifier; 
    } 

    public void setIdentifier(String identifier) { 
     this.identifier = identifier; 
    } 
} 

public interface AccountRepository extends GraphRepository<Account> { } 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"/test-context.xml"}) 
@Transactional 
public class AccountTests { 

    @Autowired 
    protected AccountRepository accountRepository; 

    @Test 
    public void accountMustLoadItsIdentities() { 
     Account acct = accountRepository.save(new Account()); 

     Identity id = new Identity(); 
     id.setIdentifier("merlin"); 
     acct.getIdentities().add(id); 
     accountRepository.save(acct); 

     acct = accountRepository.findOne(acct.nodeId); 
     id = acct.getIdentities().iterator().next(); 
     assertEquals("merlin", id.getIdentifier()); 
    }  
} 

Тестирование модуля завершается с ошибкой при последнем утверждении, но успешно выполняется, если @Fetch on Account раскоментирован.

+1

Это дизайн. Если вы хотите, чтобы отношения были с нетерпением ожидаемыми, вам понадобится аннотация. Если вы не хотите использовать аннотацию, ознакомьтесь с расширенным режимом сопоставления в документации. – tstorms

ответ

2

Вместо использования

account.getIdentities() 

вы должны сделать что-то вроде следующего:

this.neo4jTemplate.fetch(account.getIdentities()) 

Не используя ключевое слово @Fetch автоматически не позволит отложенной загрузки. Для ленивой загрузки ваши свойства используют Neo4jTemplate, как указано выше.

0

Это дизайн

Мы стараемся, чтобы избежать загрузки всего графа в памяти, не следуя отношения с нетерпением. Специальная аннотация @Fetch управляет вместо этого, если связанные объекты загружены или нет. Всякий раз, когда объект не загружен полностью, тогда сохраняется только его идентификатор. Затем эти объекты или коллекции объектов могут быть загружены явно с использованием операции template.fetch().

http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#reference:simple-mapping

+0

Я забыл упомянуть, что это в режиме простого сопоставления. В расширенном узле сопоставления свойства будут загружаться при доступе, если я его правильно пойму. – PhilBa

Смежные вопросы