1

最初のpersist()を削除すると、以下のテストは失敗します。セットをインスタンス化するためにNodeEntityを永続化する必要があるのはなぜですか?これを行うためのより良い方法はありますか?必要以上に頻繁にデータベースに書き込む必要はありません。

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

1 に答える 1

1

実行している SDN のバージョンは何ですか?

最初の永続化までエンティティは分離され、AJ はフィールドを処理しません (管理セットの作成など)。Persist は、ノードをエンティティに接続するときにノードを作成します。それ以降、トランザクションがコミットされるまで、エンティティがアタッチされ、すべての変更が書き込まれます。

コミット時にのみデータベースに書き込むため、書き込みが多すぎる心配はありません。他のすべての変更は、トランザクションのためにメモリに保持されます。おそらく、テスト メソッドに で注釈を付ける必要もあります@Transactional

このためにJIRAの問題を作成できますか? そのため、一貫した処理が提供されます。(問題は、セットを自分で初期化するときにもおそらく文句を言うことです。)

他の2つのこと:

  • Education<--Competence の関係はおそらく同じであり、別の方向にナビゲートする必要があるため、注釈に同じ名前を指定する必要があります。 type
  • 例: Education<-[:PROVIDES]-Competence

  • また、persistを呼び出さない場合、エンティティは作成されず、findOneが返されますnull

于 2011-11-11T02:21:06.943 に答える