我有两个班,第一个是公司:
@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
答案 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
,如下所示: