Neo4j SDN UUID事务处理程序

时间:2015-04-16 13:36:25

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

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

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


当前解决方案:

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

问题:

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

2 个答案:

答案 0 :(得分:1)

你有几个可能性

  1. 在实体构造函数中分配uuid,这样做的好处是您可以在等于 hashCode 中安全地使用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()方法 - 对于可以使用生命周期事件实现的内容来说太复杂了

答案 1 :(得分:0)

我刚刚在我的实体服务实现中增强了我的save方法,当它确定给定的实体是新的时,它会预先设置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);
}