2016-01-10 52 views
1

我的项目中有些奇怪的东西,我看不出它是否可能出错。与spring-data-neo4j的关系破解4.0.0

我使用Spring与spring-data-neo4j(v4.0.0)。

我的控制器中的这段代码破坏了关系。

@RequestMapping("/initialize") 
public Object initialize() { 
    Organization orga = new Organization(); 
    orga.setName("WEAVERS"); 
    this.organizationRepository.save(orga); 

    User user = new User(); 
    user.setEmail("[email protected]"); 
    user.setFirst_name("Thierno"); 
    user.setLast_name("Rignoux"); 
    user.setLogin("317"); 
    user.setOrganization(orga); 
    this.userRepository.save(user); 

    User user2 = new User(); 
    user2.setEmail("[email protected]"); 
    user2.setFirst_name("Eléonore"); 
    user2.setLast_name("Klein"); 
    user2.setLogin("nessie"); 
    user2.setOrganization(orga); 
    this.userRepository.save(user2); 

    Project project = new Project(); 
    project.setName("PROJET 1"); 
    project.setOrganization(orga); 
    project.setUser(user); 
    this.projectRepository.save(project); 

    Project project2 = new Project(); 
    project2.setName("PROJET 2"); 
    project2.setOrganization(orga); 
    project2.setUser(user2); 
    this.projectRepository.save(project2); 

    return orga; 
} 

正如你可以在这个图中看到:

enter image description here

当我创建USER2组织USER1之间的关系已经被切断。

破坏的关系是我在应用程序中随处可见的东西...我不明白!


Neo4j的配置

@EnableTransactionManagement 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableScheduling 
@EnableAutoConfiguration 
@ComponentScan(basePackages = {"fr.weavers.loom"}) 
@Configuration 
@EnableNeo4jRepositories(basePackages = "fr.weavers.loom.repositories") 
public class LoomNeo4jConfiguration extends Neo4jConfiguration { 

    public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "http://localhost:7474"; 

    @Override 
    public Neo4jServer neo4jServer() { 
     return new RemoteServer(URL,"neo4j","loomREST2016"); 
    } 

    @Override 
    public SessionFactory getSessionFactory() { 
     return new SessionFactory("fr.weavers.loom.domain"); 
    } 
} 

组织域:

public class Organization extends Node { 
@GraphId 
Long id; 

String name; 

@Relationship(type = "SET_UP", direction = Relationship.OUTGOING) 
Set<SET_UP> projects; 

@Relationship(type = "WORK_FOR", direction = Relationship.INCOMING) 
Set<WORK_FOR> users; 

[...] 

WORK_FOR域:

public class WORK_FOR extends Relationship { 

    @GraphId 
    private Long relationshipId; 

    @StartNode 
    public User user; 

    @EndNode 
    public Organization organization; 

    public WORK_FOR() { 
     super(); 
    } 

} 

用户域:

public class User extends Node { 

@GraphId 
Long id; 

String login; 

@JsonIgnore 
String password; 

String first_name; 

String last_name; 

String email; 

@Relationship(type = "WORK_FOR") 
WORK_FOR workFor; 

我到处找,我无法找到任何帮助我...

谢谢

回答

0

请注释inco您N​​ode类明关系:

@Relationship(type = "WORK_FOR", Direction = Relationship.INCOMING) WORK_FOR workFor;

按文档,所有传入的关系必须完全注释 - 默认值是外向。

+0

嗨,谢谢你的回应。 由于(用户) - [:WORK_FOR] - >(组织),我不应该把OUTGOING放在用户和INCOMING的组织中吗? – 317

+0

对不起,是的。我误解你的例子。问题可能是由于会话生存期。请看我的其他答案。 – Vince

1

在您的初始化请求中,您会创建几个存储库调用来构造数据库。这些调用中的每一个都会构造一个新的Session,从而有效地清除前一个信息,因为Spring配置默认为每个请求会话。这很可能是现有关系被删除的原因。

如果您将以下bean定义添加到您的配置中,我认为应该解决该问题。

@Override 
@Bean 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public Session getSession() throws Exception { 
    return super.getSession(); 
} 

有关会话范围的更多信息,请参阅文档here