1

如果我删除第一个 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)

能力等级:

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

教育类

@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;
    }
}
4

1 回答 1

1

您正在运行哪个版本的 SDN?

因为直到第一次持久化之前,实体都是分离的,并且 AJ 不处理字段(如创建托管集)。Persist 在将其连接到实体时创建节点,从那时起直到事务提交,您的实体已附加,所有更改都将被写入。

它只在提交时写入数据库,所以不用担心写入太多。所有其他更改将仅保存在您的交易内存中。可能您还应该使用@Transactional.

您可以为此创建一个JIRA问题吗?从而提供一致的处理。(问题是当你自己初始化集合时它可能也会抱怨。)

另外两件事:

  • 由于您之间的关系 Education<--Competence 可能是相同的,并且应该只是朝另一个方向导航,因此您必须在注释中提供相同的名称。 type
  • 例如教育<-[:PROVIDES]-能力

  • 另外,如果您不调用persist,则不会创建您的实体,然后通过返回findOnenull

于 2011-11-11T02:21:06.943 回答