【问题标题】:What is correct way to save Node with RelationshipEntity in Spring Data neo4j?在 Spring Data neo4j 中使用 RelationshipEntity 保存节点的正确方法是什么?
【发布时间】:2013-08-23 07:16:19
【问题描述】:

实际上,我正在尝试使用RelationshipEntity 类保存一个节点,如下所示:

  1. 节点类

    @NodeEntity  
    public class MyEvent  
    {  
         @GraphId  
         private Long nodeId;  
         @RelatedToVia(type = "INVITED_TO")  
         @Fetch Set<EventResponse> eventResponse;  
    }
  2. 关系实体类

    @RelationshipEntity(type="INVITED_TO")  
    public class EventResponse  implements Serializable   
    {  
       @GraphId  
       Long nodeId;  
    
       @StartNode  
       MyEvent event;  
    
       @EndNode  
       User user;  
    
      //  .....  
    

    }

当我试图保存MyEvent

org.neo4j.graphdb.NotFoundException: '__type__' property not found for RelationshipImpl #153 of type 15 between Node[159] and Node[117].

所以我猜基于上述异常,它在某处缺少__type__ 属性,这是识别任何节点类型所必需的。我不完全明白,有什么方法可以保存第一个关系实体,然后是 NodeEntity,反之亦然,或者同时保存??

【问题讨论】:

    标签: java spring spring-data-neo4j


    【解决方案1】:

    type 属性不需要您明确设置。它由 spring-data-neo4j 管理。

    以下代码 sn-ps 对我有用:

    事件类:

    @NodeEntity
    public class MyEvent
        {
    
        @GraphId
        private Long       nodeId;
    
        @RelatedToVia(type = "INVITED_TO")
        @Fetch
        Set<EventResponse> eventResponse;
    
        }
    

    用户类:

    @NodeEntity
    public class User
        {
    
        @GraphId
        private Long userId;  
    
        }
    

    还有响应类:

    @RelationshipEntity(type = "INVITED_TO")
    public class EventResponse
        {
    
        @GraphId
        private Long    nodeId;
    
        @StartNode
        MyEvent event;
    
        @EndNode
        User    user;
    
        }
    

    我在一个简短的junit测试中使用它们:

    @Autowired
        private Neo4jTemplate template;
    
        @Transactional
        @Test
        public void saveEvent()
            {
    
            User user = new User();
            MyEvent event = new MyEvent();
    
            EventResponse response = new EventResponse();
            response.user = user;
            response.event = event;
    
            this.template.save(user);
            this.template.save(event);
            this.template.save(response);
    
            }
    

    【讨论】:

    • 那么 Neo4jTemplate 和 Repository 类之间有什么显着区别吗?因为我试图通过存储库保存它。另一件事是,用户已经存在他自己的财产和关系,我只需要邀请用户参加 MyEvent,它就崩溃了。
    • AFAIK 您可以同时使用存储库和模板来平等地保存节点/关系。我将上面的示例更改为使用 GraphRepository 和 GraphRepository 。两者都有效。同样当用户实体已经被持久化时。只需获取加载的用户对象实例并将其分配给 response.user。并确保在保持关系之前保持事件。
    • 是的,它奏效了.. 非常感谢确保在保持关系之前保持事件。我犯的错误是,首先通过调用 setter 将 MyEvent 和 EventResponse 保存到其中。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多