Как сохранить отношения между Neo4J NodeEntitys в Spring Data Graph, не вызывая persist дважды - PullRequest
1 голос
/ 10 ноября 2011

Приведенный ниже тест не пройден, если я удаляю первый persist (). Почему мне нужно сохранить NodeEntity для создания экземпляра Set? Есть ли лучший способ сделать это? Я не хочу писать в базу данных чаще, чем нужно.

 @Test
public void testCompetenceCreation() {
    Competence competence = new Competence();
    competence.setName("Testcompetence");
    competence.persist(); //test fails if this line is removed
    Competence competenceFromDb = competenceRepository.findOne(competence.getId());

    assertEquals(competence.getName(), competenceFromDb.getName());

    Education education = new Education();
    education.setName("Bachelors Degree");
    competence.addEducation(education);
    competence.persist();


    assertEquals(competence.getEducations(), competenceFromDb.getEducations());
}

Если я удаляю упомянутую строку, возникает исключение ниже:

Выдает

java.lang.NullPointerException
at com.x.entity.Competence.addEducation(Competence.java:54)

Competence.class:

@JsonIgnoreProperties({"nodeId", "persistentState", "entityState"})
@NodeEntity
public class Competence {

    @RelatedTo(type = "EDUCATION", elementClass = Education.class)
    private Set<Education> educations;

    public Set<Education> getEducations() {
        return educations;
    }

    public void addEducation(Education education) {
        this.educations.add(education);
    }
}

Education.class

@JsonIgnoreProperties({"nodeId", "persistentState", "entityState"})
@NodeEntity
public class Education {

    @GraphId
    private Long id;

    @JsonBackReference
    @RelatedTo(type = "COMPETENCE", elementClass = Competence.class, direction = Direction.INCOMING)
    private Competence competence;

    @Indexed
    private String name;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

1 Ответ

1 голос
/ 11 ноября 2011

Какую версию SDN вы используете?

Потому что вплоть до первого сохранения сущность отсоединяется, а AJ не заботится о полях (например, при создании управляемого набора). Persist создает узел, соединяющий его с сущностью, с тех пор, пока транзакция не завершится, ваша сущность присоединится, и все изменения будут записаны.

Он записывает только в базу данных при коммите, поэтому не стоит беспокоиться о слишком большом количестве записей. Все остальные изменения будут просто храниться в памяти для вашей транзакции. Вероятно, вам также следует пометить метод теста @Transactional.

Можете ли вы создать для этого проблему JIRA ? Так что обеспечивается согласованная обработка. (Проблема в том, что он, вероятно, также жалуется, когда вы сами инициализируете набор.)

Две другие вещи:

  • поскольку ваши отношения между образованием <- компетенция, вероятно, такая же, и вам нужно просто ориентироваться в другом направлении, вы должны указать <em>то же type имя в аннотации.
  • например. Образование <- [: ПРЕДОСТАВЛЯЕТ] -Competence </p>

  • также, если вы не вызываете persist, ваша сущность не будет создана, а затем findOne, возвращая null

...