多对多关系,如果 @Relationship 注释中标记了方向,则两个实体都没有关联

问题描述

环境细节:
Java版本:1.8
neo4j.ogm.version = 3.2.24
neo4j 服务器版本 = 4.3.2

型号详情:
人有很多地址
地址人多

重现步骤

  1. 创建了两个人和一个地址
  2. 与此人关联的相同地址
  3. 救了两个人

方向是人->出地址

预期:两个人都应该与同一个地址实体相关。
实际:最后保存的人是相关的。其他人不相关(悬空) 如果只是用 @Relationship 注释该字段,那么这个人都是相关的。 但是需要在@Relationship 中提供方向。
对象模型

    @NodeEntity
    public class Person {
    @Id
    @GeneratedValue
    public Long nativeId;
    private String name;

    @Relationship(type = "addresses",direction = Relationship.OUTGOING)
    private Set<Address> addresses;

    public String getName() {
        return name;
    }

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

    public Set<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(Set<Address> addresses) {
        this.addresses = addresses;
    }

    public void addAddress(Address address) {
        this.addresses = this.addresses == null ? new HashSet<Address>() : this.addresses;
        this.addresses.add(address);
    }

}

import java.util.Set;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

@NodeEntity
public class Address {

    @Id
    @GeneratedValue
    public Long nativeId;
    private String zipCode;

    @Relationship(type = "addresses",direction = Relationship.INCOMING)
    private Set<Person> persons;

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public Set<Person> getPersons() {
        return persons;
    }

    public void setPersons(Set<Person> persons) {
        this.persons = persons;
    }

}

public class ManytoManyTest {

    public static void main(String[] args) {
        Configuration configuration = new Configuration.Builder().uri("bolt://localhost").credentials("neo4j","test")
                .useNativeTypes().verifyConnection(true).build();
        SessionFactory sessionFactory = new SessionFactory(configuration,"com.domain.model");
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        
        Person hash = new Person();
        hash.setName("hash");

        Person dhi = new Person();
        dhi.setName("dhi");

        Address address = new Address();
        address.setZipCode("560001");

        hash.addAddress(address);
        dhi.addAddress(address);

        session.save(hash);
        session.save(dhi);

        session.getTransaction().commit();
        sessionFactory.close();
    }

}

图中的示例输出 dandling person node in graph

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)