ale*_*oid 1 neo4j spring-data-neo4j-4 neo4j-ogm
我读到使用Neo4j内部Ids用于外部目的并不是一个好习惯.
我想我在SDN4/Neo4j应用程序中犯了一个错误,因为我到处都在使用内部ID.
我的应用程序中的每个SDN 4节点实体都具有以下属性:
@GraphId
private Long id;
Run Code Online (Sandbox Code Playgroud)
我使用这个long值作为我的Web应用程序URL的一部分..例如
/products/3245234
Run Code Online (Sandbox Code Playgroud)
其中3245234
是此产品节点实体的内部Neo4j标识符.
从Neo4j的角度来看是否安全 - 以这种方式使用内部ID?如果不是,请举例说明新的代理键如何解决这个问题.
小智 5
当谈到Neo4j内部ID如何被回收时,Eric所说的是正确的.
我们已经开始增加对SDN的支持,以帮助开发人员解决这个问题.我们可以通过几个例子来做到这一点.
示例1:当您拥有自然ID时
假设我们有一个User
域对象,它可以被一个名为的字段唯一标识email
.我们可能会这样设置我们的模型:
@NodeEntity
public class User {
@GraphId
private Long id;
@Index(unique=true, primary=true)
private String email;
...
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以设置一个存储库:
public interface UserRepository extends CrudRepository<User, String> {
}
Run Code Online (Sandbox Code Playgroud)
注意参数化类型中的最后一个值是String.这表示用于此类的主索引.
您现在可以执行以下操作:
User user = userRepository.findOne("john.doe@email.com");
Run Code Online (Sandbox Code Playgroud)
了解如何只传入课程的主要ID?
示例2:当您需要合成ID时
假设我们上面定义的用户有推文.由于推文没有自然ID,我们给它一个.避免ID冲突的最佳方法是使用类型4 UUID.幸运的是,Java预装了UUID,SDN支持它的持久性.
import org.neo4j.ogm.annotation.typeconversion.Convert;
import org.neo4j.ogm.typeconversion.UuidStringConverter;
import java.util.UUID;
@NodeEntity
public class Tweet {
@GraphId
private Long id;
@Convert(UuidStringConverter.class)
@Index(unique = true, primary = true)
private UUID uuid;
...
public Tweet(String message) {
this.uuid = UUID.randomUUID();
// other initialisation.
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们这里有一个UUID
分配给任何创建的推文.然后可以通过转换器将其保存到数据库中.关于这一点的一个方便的事情是没有额外的库可以安装.它也保证(好吧,大部分!)永远不会有内部Neo4j ID的问题.专业(或者说)是由您的应用程序代码制作的ID是普遍唯一的.
如果您希望数据库始终生成UUID,那么我还建议使用GraphAware https://github.com/graphaware/neo4j-uuid插件.
Tweet存储库再次可以利用这个:
public interface TweetRepository extends CrudRepository<Tweet, UUID> {
}
Run Code Online (Sandbox Code Playgroud)
您现在可以执行以下操作:
Tweet tweet = tweetRepository.findOne(UUID.fromString("0f6e7004-cefc-4397-b4d2-078c1370856a"));
Run Code Online (Sandbox Code Playgroud)
最后一点; 在撰写本文时,@Indexed(unique=true,primary=true)
可以将其更改为@Id
在SDN 5.0中简单调用.
归档时间: |
|
查看次数: |
384 次 |
最近记录: |