Spring Data Neo4j不会插入新节点,只更新具有相同属性的现有节点

时间:2016-08-26 15:38:01

标签: java neo4j spring-data spring-data-neo4j

当我尝试为SpringData保存一个新节点时,它具有与现有节点相同的属性和关系,它只更新现有节点并且不插入新节点。我用null ID保存它。

有什么问题?

Neo4j 3.0.0
Spring Data 4.1.2
Neo4j OGM 2.0.2

 public abstract class ModelObject {

    @GraphId
    protected Long id;

    //getters and setters

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || id == null || getClass() != o.getClass())
            return false;

        ModelObject entity = (ModelObject) o;

        if (!id.equals(entity.id))
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        return (id == null) ? -1 : id.hashCode();
    }

}


    @RelationshipEntity(type = "COLLECTION")
public class Collection  extends ModelObject{

    @DateString("yyyy-MM-dd")
    private Date acquisitionDate;
    @StartNode
    private User collector;
    @EndNode
    private Item item;
    private Boolean manual;
    private Boolean box;
    private Double paidValue;
    private String historyAcquisition;

    //getters and setters

}



 @Service
public class CollectionServiceImpl implements ICollectionService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private CollectionRepo collectionRepo;

    @Autowired
    private ItemRepo itemRepo;

    @Override
    public Iterable<Collection> findByUserId(Integer idUser) {
        return collectionRepo.findByCollectorId(idUser);
    }

    @Override
    public boolean addItemCollection(Collection collection, Long itemId) {

        try {

        Long userId = collection.getCollector().getId();

        collection.setCollector(userRepo.findOne(userId, 1));
        collection.setItem(itemRepo.findOne(itemId, 1));
        collection.setId(null);


        collectionRepo.save(collection);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }


    @Override
    public boolean removeItemCollection(Long collectionId, Long itemId) {

        try {

        collectionRepo.delete(collectionId);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }


}


@NodeEntity(label="USER")

public class User extends ModelObject {

private String fullName;
private String userName;
private String password;
private Country country;

@DateString(DateUtil.yyyy_MM_dd)
private Date birthDate;

@Relationship(type="FOLLOWING", direction=Relationship.OUTGOING )
private Set<Following> following;

@Relationship(type="COLLECTION", direction=Relationship.OUTGOING )
private List<Collection> collection ;

}

1 个答案:

答案 0 :(得分:1)

这可能是因为您明确将id设置为null。 OGM会话跟踪实体引用,并且这种情况无效 - 现在已知的,先前保存的具有空id的实体。为什么不创建一个新的Collection对象来保存?

根据评论更新

SDN / OGM只会在具有相同属性集的两个给定节点之间创建一个关系。在一对节点之间具有相同属性值的关系通常没有多大价值。如您所述,添加时间戳是强制多个关系的一种方法,如果这是图模型所需要的。