为什么我修改的neo4j节点属性没有持久保存到db?

时间:2015-07-19 20:40:42

标签: neo4j spring-data-neo4j

我正在使用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类:

@NodeEntity
public class MyNode {

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

    public SubObject getSubObject() {
        return subObject;
    }
}

这是SubObject类:

@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类,并观察executeModified方法处理命令,但是我改变的字段没有在那里表示。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 对于尚未保留相关节点的情况,将自动保存相关节点。
  • 对于已经保留相关节点的情况,例如当您稍后回来进行编辑时,将不会选择相关节点上的属性更改。