1

У меня есть два класса первой является Компания:Как сохранить отношения в объекте отношения?

@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); 

Когда я пытаюсь создать фиктивные данные, используя код выше отношения между двумя узлами не создано. Создаются только узловая компания и продукт. Как создать/сохранить объект отношения в этом случае?

Спасибо

Update # 1:

я уже пытался добавить CompanyHasLicenseFor как свойство отношения в своем классе компании: @GraphId частный Long graphId;

private String id; 

private String name; 

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

Однако отношения до сих пор не создано

Update # 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-ОГМ-2.1.1

Это мой Sample Code при необходимости

Screenshot of my database

+0

Являются ли 'companyService',' productService' и 'companyHasLicenseForService' все хранилища данных Spring Data? Если так, то все должно работать. Вероятно, вам понадобится '@ Transactional', окружающая ваши три метода сохранения, если вы хотите, чтобы это действие было атомарным. – digx1

+0

@ digx1 Да, все службы вызовут функцию репозитория. Я уже добавил аннотацию Transactional над объявлением открытого класса. Но отношения все еще не созданы в neo4j –

ответ

0

Ответ 1:

Я смотрю на ваш Sample Project. Проблема в том, что вы не определяете пакет neo4jconfig вашей модели отношений. Вы должны определить свой пакет com.example.neo.relationshipModel на SessionFactory так:

@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

0

Из документов SDN:

пути в графе записываются, начиная с узлами первой и затем отношения между ними создается. Таким образом, вы должны структуры ваших моделей предметной области, так что отношения субъекты достижимы из узла сущностей для этого, чтобы работать правильно

Так что я думаю, что вам нужно сделать CompanyHasLicenseFor атрибут ваших лиц.

Update после того, как глядя на образец кода:

И

Вы должны убедиться, как ваши лица и отношения сканируются OGM.В вашей конфигурации (session factory init) вы указываете OGM на сканирование пакета com.example.neo.model, но ваш объект отношения живет в пакете com.example.neo.relationshipModel, поэтому он не подбирается.

=> Переместить CompanyHasLicenseFor класс в отсканированном пакете или добавить другой пакет в конструктор фабрики сеансов.

+0

Привет, я уже пробовал ваше решение и добавляю коды в свой вопрос в обновлении # 1 - это то, что вы имеете в виду? потому что отношения все еще не создаются даже после того, как я добавлю это свойство отношения в мой класс. –

+0

И разве ваш объектный граф непротиворечен, прежде чем вы сохраните его? т. е. вы устанавливаете company.companyLicense? – Luanne

+0

@ Luanne Нет, я не установил company.companyLicense после того, как я сохранил объект отношений. Нужно ли мне это делать? –

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

  • Нет связанных вопросов^_^