2

摘要: 使用SDN4,我坚持 10 个对象,其中一半具有相同的内容,只是它们链接到的 id 不同。链接 ID 设置为@Transient。尽管如此,还是会创建两个具有相同内容的对象,而不是一个具有两个指向它的链接的对象。我怎样才能避免这种行为?

详细信息: 我们定义了两个域对象和通过 CSV 的信息源,它们如下所示:

域对象 CSV:

key,name
1,test1
3,test3

波乔一:

@Transient
private int key;    
private String name;

@Relationship(type = "HAS_CERTIFICATION", direction = "OUTGOING")
private Set<B> bObject = new HashSet<>();

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

@Relationship(type = "HAS_CERTIFICATION", direction = "OUTGOING")
public void hasCertification(B b) {
    bObject.add(b);
    b.getA().add(this);
}

域对象 B:

foreignKey,name,value
1,ISO9001,TRUE
1,ISO14001,TRUE
3,ISO9001,TRUE
3,ISO14001,TRUE

POJO B:

@Transient
private int foreignKey;
private String name;
private String value;

@Relationship(type = "HAS_CERTIFICATION", direction = "INCOMING")
private Set<A> a = new HashSet<>();

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

public void setValue(String value) {
    this.value = value;
}

@Relationship(type = "HAS_CERTIFICATION", direction = "INCOMING")
public Set<A> getA() {
    return a;
}

这些 CSV 文件在它们各自的 POJO(A 和 B)中被解析并加载到 SDN4 中。

现在我们遍历这些对象并添加关系:

private void aHasCertification(
        Optional<List<B>> b,
        Optional<List<A>> a) {
    for (A aObj : a()) {
        for (B bObj : b()) {
            if(bObj.getForeignKey() == aObj.getKey()) {
                aObj.hasCertification(bObj);
            }
        }
    }
}

然后根存储库repositoryA 用于保存加载的对象。repositoryA.save(domainObjectA);

现在当我查询数据库时;match n return n;

对于每个 A 对象,将有两个ISO9001和两个ISO14001对象。而不是我所期望的,每个都有两个指向A:1和的链接A:3

4

1 回答 1

2

如果我理解正确,而不是

在此处输入图像描述

你期待

在此处输入图像描述?

OGM 无法知道具有相同“名称”的 B 的两个实例是同一个节点。您需要做的是按属性加载 B 节点,如果存在,则使用它与 A 相关,否则创建它。我怀疑您需要进一步处理 CSV 数据,而不是使用几乎 1:1 映射到 CSV 行来对对象进行建模。

于 2015-10-02T16:50:23.830 回答