Neo4j SDN UUID 事务处理器
Neo4j SDN UUID Transaction Handler
我在嵌入式模式下使用 Neo4j 2.1.7 和 SDN 3.3。0.RELEASE。
如何自动将 UUID 分配给新节点?尝试实现此目标的最佳做法是什么?
当前解:
我添加了一个 TransactionEventHandler,它会自动向每个节点添加一个 uuid 属性。此外,当有人试图删除 uuid 时,此处理程序还会阻止提交。
问题:
对于 SDN,我总是必须在我的事务之外重新加载实体才能使用生成的 uuid。这限制了@Transactional 的用处。有没有办法解决这个问题?
我刚刚在我的实体服务实现中增强了我的保存方法,当它确定给定的实体是新的时,它会预先设置 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);
}
你有几种可能性
在实体构造函数中分配uuid,这样做的好处是你可以在equals和hashCode[中安全地使用uuid =27=].
MyNodeEntity() {
uuid = UUID.randomUUID.toString()
....
}
使用lifecycle events,对于类似“add 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());
}
}
};
}
子类 GraphRepository 并覆盖 save() 方法 - 对于使用生命周期事件可以实现的事情来说太复杂了
我在嵌入式模式下使用 Neo4j 2.1.7 和 SDN 3.3。0.RELEASE。
如何自动将 UUID 分配给新节点?尝试实现此目标的最佳做法是什么?
当前解:
我添加了一个 TransactionEventHandler,它会自动向每个节点添加一个 uuid 属性。此外,当有人试图删除 uuid 时,此处理程序还会阻止提交。
问题:
对于 SDN,我总是必须在我的事务之外重新加载实体才能使用生成的 uuid。这限制了@Transactional 的用处。有没有办法解决这个问题?
我刚刚在我的实体服务实现中增强了我的保存方法,当它确定给定的实体是新的时,它会预先设置 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);
}
你有几种可能性
在实体构造函数中分配uuid,这样做的好处是你可以在equals和hashCode[中安全地使用uuid =27=].
MyNodeEntity() { uuid = UUID.randomUUID.toString() .... }
使用lifecycle events,对于类似“add 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()); } } }; }
子类 GraphRepository 并覆盖 save() 方法 - 对于使用生命周期事件可以实现的事情来说太复杂了