为什么我修改后的 neo4j 节点 属性 没有保存到数据库中?

Why is my modified neo4j node property not persisted to the db?

我正在使用 Spring Data Neo4J 3.3.1,我在更新节点时遇到困难。我有与此等效的代码,它对数据库的影响为零:

@Transactional
public void editTitle(Long nodeId, String newTitle) {
    MyNode existingNode = nodeRepository.findOne(nodeId);
    existingNode.getSubObject().setTitle(newTitle);
    nodeRepository.save(existingNode);
}

这是 MyNode class:

@NodeEntity
public class MyNode {

    @Fetch
    @RelatedTo(type="LINKED_TO", direction = Direction.OUTGOING)
    private SubObject subObject;

    public SubObject getSubObject() {
        return subObject;
    }
}

这是子对象 class:

@NodeEntity
public class SubObject {

    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

我可以毫无问题地保存 MyNode 类型的新节点。我只是调用 nodeRepository.save(newNode); 并且它立即将 MyNode 和 SubObject 保存到数据库中。

我已确认交易正在提交中。我一直跟踪调用堆栈一直到 NeoStoreTransaction class 并观察了 executeModified 方法处理命令,但我更改的字段未在此处表示。

对于编辑,您需要明确保存相关节点:

@Transactional
public void editTitle(Long nodeId, String newTitle) {
    MyNode existingNode = nodeRepository.findOne(nodeId);
    existingNode.getSubObject().setTitle(newTitle);
    subObjectRepository.save(existingNode.getSubObject());
    nodeRepository.save(existingNode);
}

这是因为保存操作会根据相关节点是否已经持久化到数据库来区别对待它们。

  • 对于关联节点还没有持久化的情况,会自动保存关联节点。
  • 对于相关节点已经持久化的情况,例如当您稍后回来进行编辑时,将不会选取对相关节点上的属性所做的更改。