如何在关系实体中保存关系?

时间:2017-01-24 11:22:03

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

我有两个班,第一个是公司:

@GraphId
private Long graphId;

private String id;

private String name;

第二课是产品:

@GraphId
private Long graphId;

private String id;

private String name;

在这两个类之间,关系是公司有许可证,我想创建关系实体,这样我就可以在关系中保存属性。 所以我创建了这个名为CompanyHasLicenseFor的关系实体类:

@RelationshipEntity(type="company_has_license_for")
public class CompanyHasLicenseFor {
    @GraphId
    private Long graphId;

    private String id;

    @StartNode
    private Company company;

    @EndNode
    private Product product;

    private Date startDate;

    private Date endDate;

}

这是我用来创建关系的代码:

Company company = new Company("Company Test");
companyService.save(company);
Product product = new Product("Product Test");
productService.save(product);
CompanyHasLicenseFor com = new CompanyHasLicenseFor(company, product, new Date(), new Date());
companyHasLicenseForService.save(com);

当我尝试使用上面的代码创建虚拟数据时,两个节点之间的关系没有创建。仅创建节点公司和产品。 在这种情况下如何创建/持久化关系实体?

谢谢

更新#1:

我已经尝试将CompanyHasLicenseFor添加为公司类中的关系属性: @GraphId     private long graphId;

private String id;

private String name;

@Relationship(type="company_has_license_for")
private CompanyHasLicenseFor companylicense;

然而这种关系仍未创造

更新#2:

@NodeEntity
public class Company {
    @GraphId
    Long graphId;
    String id;
    String name;

    @Relationship(type="company_has_license_for", direction = "UNDIRECTED")
    Set<CompanyHasLicenseFor> companylicenses;

    .....
}

@NodeEntity
public class Product {
    @GraphId
    Long graphId;
    String id;
    String name;

    @Relationship(type = "company_has_license_for", direction = "UNDIRECTED")
    Set<CompanyHasLicenseFor> companylicenses;

    ....    
}

@RelationshipEntity(type="company_has_license_for")
public class CompanyHasLicenseFor {
    @GraphId
    Long graphId;
    String id;

    @StartNode
    Company company;

    @EndNode
    Product product;

    ....
}

我使用的是Spring Data Neo4j 4.2.0.RELEASE和neo4j-ogm-2.1.1

如果需要,这是我的Sample Code

Screenshot of my database

2 个答案:

答案 0 :(得分:0)

来自SDN文档:

  图中的

路径首先从节点开始写入   他们之间建立了关系。因此,你需要   构建您的域模型,以便关系实体   可以从节点实体访问,以使其正常工作

所以我想你需要让CompanyHasLicenseFor成为你实体的一个属性。

查看示例代码后更新:

您应该确保OGM扫描您的实体和关系。在您的配置(会话工厂初始化)中,您告诉OGM扫描包com.example.neo.model,但您的关系实体位于包com.example.neo.relationshipModel中,因此它不会被接收。

=&GT;在已扫描的包中移动CompanyHasLicenseFor类,或在会话工厂构造函数中添加其他包。

答案 1 :(得分:0)

回答1:

我看看你的示例项目。问题是,您没有定义关系模型的neo4jconfig包。您需要在 SessionFactory 中定义com.example.neo.relationshipModel的包,如下所示:

@Bean
public SessionFactory sessionFactory() {
    // with domain entity base package(s)
    return new SessionFactory("com.example.neo.model","com.example.neo.relationshipModel", "BOOT-INF.classes.com.example.neo.model");
}

回答2:

如果您不想更改neo4jconfig,可以更改模型结构,将 CompanyHasLicenseFor.java 移至包com.example.neo.model,如下所示:

enter image description here