使用带有Spring Data Neo4j的远程Neo4j服务器时,不会保存数据

时间:2016-03-26 14:48:58

标签: spring neo4j spring-data-neo4j-4

我使用spring-data-neo4j创建了一个Maven项目。我还安装了独立的Neo4j Server Community Edition 2.3.3。我试图将一些Vertex对象保存到数据库,然后只是检索它们以检查一切正常。然后,我希望能够在独立服务器中打开创建的数据库,以实现更好的可视化。 我用作依赖项:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency> 

配置类是:

@Configuration
@ComponentScan("neo4j.example")
@EnableAutoConfiguration
@EnableNeo4jRepositories("neo4j.example.repository")

public class App extends Neo4jConfiguration {

    public App() {
        System.setProperty("username", "neo4j");
        System.setProperty("password", "root");
    }

    @Override
    public SessionFactory getSessionFactory() {
        return new SessionFactory("neo4j.example.model");
    }

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

    @Override
    public Neo4jServer neo4jServer() {
        return new RemoteServer("http://localhost:7474");
    }

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }


    }

我的NodeEntity如下:

@NodeEntity
public class Vertex  {

    private String name;
    @GraphId
    private Long id;

    @Relationship(type = "PAIRS_WITH", direction = "UNDIRECTED")
    public  Set<Vertex> teammates;

    public Vertex() {   }

// getters, setters, equals, toString
    }

存储库:

@Repository
public interface VertexRepository extends GraphRepository<Vertex> {

    Vertex findByName(String name);

    List<Vertex> findByTeammatesName(String name);
}

服务:

@Service
public class VertexServiceImpl implements VertexService {

    @Autowired
    private VertexRepository vertexRepository;

    @Override
    @Transactional
    public Vertex create(Vertex vertex) {
        return vertexRepository.save(vertex);
    }

    @Override
    @Transactional
    public Iterable<Vertex> findAll() {
        return vertexRepository.findAll();
    }
//....
}

然后我有一个控制器,有两个简单的方法来保存顶点,然后查询数据库。

@RestController
@RequestMapping("/api/")
public class GraphController {

    @Autowired
    VertexService vertexService;

    @RequestMapping(value = "addvertex", method = RequestMethod.GET)
    public void add() {
        Vertex v = new Vertex();
        v.setId(1l);
        v.setName("name");
        Vertex v2 = new Vertex();
        v2.setId(2l);

        v.worksWith(v2);
        vertexService.create(v);
    }

    @RequestMapping(value = "all", method = RequestMethod.GET)
    public Iterable<Vertex> getAll() {
        return vertexService.findAll();
    }

}

当我将顶点保存到db时,没有错误。当我呼叫/所有数据库都是空的。我检查了messages.log,没有例外......最后一行是:

2016-03-26 14:25:15.716+0000 INFO  [o.n.k.i.DiagnosticsManager] Interface Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000:
2016-03-26 14:25:15.716+0000 INFO  [o.n.k.i.DiagnosticsManager] --- INITIALIZED diagnostics END ---
2016-03-26 14:25:15.747+0000 INFO  [o.n.k.i.DiagnosticsManager] --- STOPPING diagnostics START ---
2016-03-26 14:25:15.747+0000 INFO  [o.n.k.i.DiagnosticsManager] --- STOPPING diagnostics END ---
2016-03-26 14:25:15.747+0000 INFO  [o.n.k.i.f.GraphDatabaseFacade] Shutdown started

完全赞赏任何帮助!

2 个答案:

答案 0 :(得分:3)

我设法解决了我的问题。配置很好,问题是我试图设置@NodeEntity对象的id属性。即使我删除了@GraphId属性,也不会保存顶点。 This post解决了同样的问题 In Good Relations:The Spring Data Neo4j Guide Book提到:“如果该字段简称为'id',则无需使用@GraphId对其进行注释,因为OGM会自动使用它。”

如果存在某种警告/错误消息或者文档中更明确地提到您不能设置setId()并且如果这样,节点将不会保存在数据库中,那将是很好的。希望这会节省一些时间!

答案 1 :(得分:2)

您正在混合嵌入式和远程服务器吗?

您应该在远程服务器中查找数据。

此外,您必须已禁用身份验证才能在服务器中使用,或者您必须为配置提供用户名(neo4j)和密码。

请勿在服务器使用的同一目录上启动嵌入式数据库