【问题标题】:Neo4j SDN UUID Transaction HandlerNeo4j SDN UUID 事务处理程序
【发布时间】:2015-04-16 13:36:25
【问题描述】:

我在嵌入式模式下使用带有 SDN 3.3.0.RELEASE 的 Neo4j 2.1.7。

如何自动将 UUID 分配给新节点?尝试实现这一目标时的最佳做法是什么?


目前的解决方案:

我添加了一个 TransactionEventHandler,它会自动为每个节点添加一个 uuid 属性。此外,当有人试图删除 uuid 时,此处理程序还会阻止提交。

问题:

使用 SDN,我总是必须在我的事务之外重新加载实体才能使用生成的 uuid。这限制了@Transactional 的用处。有没有办法解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    你有几个可能性

    1. 在实体构造函数中分配uuid,这样做的好处是你可以在equalshashCode中安全地使用uuid。

      MyNodeEntity() {
        uuid = UUID.randomUUID.toString()
        ....
      }
      
    2. 使用lifecycle events,对于类似“添加uuid”的情况非常有用 如果没有设置”

      @Bean
      ApplicationListener<BeforeSaveEvent> beforeSaveEventApplicationListener() {
          return new ApplicationListener<BeforeSaveEvent>() {
              @Override
              public void onApplicationEvent(BeforeSaveEvent event) {
                  MyNodeEntity entity = (MyNodeEntity) event.getEntity();
                  if (!entity.hasUuid()) {
                      entity.setUuid(UUID.randomUUID.toString());
                  }
              }
          };
      }
      
    3. 子类 GraphRepository 并覆盖 save() 方法 - 对于使用生命周期事件可以实现的事情来说太复杂了

    【讨论】:

      【解决方案2】:

      我刚刚在我的实体服务实现中增强了我的保存方法,当它确定给定实体是新的时,它将预先设置 uuid。

      实体:

      public boolean isNew() {
          return null == getId();
      }
      

      EntityServiceImpl:

      @Override
      public T save(T node) {
          if (node.isNew() && node.getUuid() == null) {
              node.setUuid(UUIDTransactionEventHandler.getUUID());
          }
          return nodeRepository.save(node);
      }
      

      【讨论】:

        猜你喜欢
        • 2017-07-02
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多