У меня возникают проблемы с производительностью при сохранении циклических отношений (3 объекта) при использовании neo4j OGM: https://i.imgur.com/OP43FTB.png
Правила:
- 1 курс состоит из 1 предмета и 1 учителя
- Учитель имеет несколько курсов и несколько предметов
- В предметах есть несколько учителей и несколько курсов
Исходя из количества сохраненных экземпляров, время сохранения не является линейным, после определенного количества объектов операция «никогда» не завершается.
Используются следующие версии: neo4j-ogm-core и neo4j-ogm-bolt-driver версии 3.1.8
На основе класса сущности:
@NodeEntity
public abstract class Entity {
@Id
@GeneratedValue
private Long id;
@Index(unique = true)
private String uuid;
public Entity() {
uuid = UUID.randomUUID().toString();
}
public Long getId() {
return id;
}
public String getUuid() {
return uuid;
}
@Override
public int hashCode() {
return Objects.hash(uuid);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Entity)) {
return false;
}
Entity other = (Entity) obj;
return Objects.equals(getUuid(), other.getUuid());
}
}
@NodeEntity
public class Course extends Entity {
private String name;
@Relationship(type = "SUBJECT_TAUGHT")
private Subject subject;
@Relationship(type = "TEACHES_CLASS", direction = Relationship.INCOMING)
private Teacher teacher;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
@NodeEntity
public class Subject extends Entity {
private String name;
@Relationship(type = "TAUGHT_BY")
private Set<Teacher> teachers = new HashSet<>();
@Relationship(type = "SUBJECT_TAUGHT", direction = "INCOMING")
private Set<Course> courses = new HashSet<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
@NodeEntity
public class Teacher extends Entity {
private String name;
@Relationship(type = "TEACHES_CLASS")
private Set<Course> courses = new HashSet<>();
@Relationship(type = "TAUGHT_BY", direction = Relationship.INCOMING)
private Set<Subject> subjects = new HashSet<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
public Set<Subject> getSubjects() {
return subjects;
}
public void setSubjects(Set<Subject> subjects) {
this.subjects = subjects;
}
}
Список курсов создается и сохраняется таким образом:
public T createOrUpdate(T entity) {
session.save(entity);
return find(entity.getId());
}
Когда генерируется 10 экземпляров каждого класса (10 курсов, 10 учителей, 10 предметов), метод сохранения никогда не заканчивается.
Спасибо.