代码之家  ›  专栏  ›  技术社区  ›  Tyler

为什么我修改的neo4j节点属性没有持久化到数据库中?

  •  0
  • Tyler  · 技术社区  · 11 年前

    我使用的是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 回复  |  直到 11 年前
        1
  •  1
  •   Tyler    11 年前

    对于编辑,需要显式保存相关节点:

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

    这是因为保存操作根据相关节点是否已持久化到数据库而对其进行不同的处理。

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