Spring-data-neo4j v4,为什么没有索引

时间:2016-05-02 20:20:28

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

根据migration of SDN (Spring-data-neo4j) v3 to SDN4,索引不再存在,因此预计不再使用索引。

@NodeEntity
public class User extends Unversioned{
    @Indexed(unique=true,failOnDuplicate = true) // <-- THIS
    private String login;
    ...
}

根据herethere,似乎没有人感到惊讶。这不是在模型本身上定义约束的“要点”吗?

Sring-data主页上定义的任务:

  

Spring Data的使命是为数据访问提供熟悉且一致的,基于Spring的编程模型,同时仍保留底层数据存储的特​​殊特性。

即使与the latest Spring-data-JPA official example进行比较,仍然会在模型上定义约束:

@Entity
public class Customer extends AbstractEntity {

    private String firstname, lastname;

    @Column(unique = true)
    private EmailAddress emailAddress;

允许在基于java的模型上定义约束似乎是一个不易出错的系统。 如果模型和模型,我们如何建立一个模型一致?约束是否解耦?我错过了什么?

2 个答案:

答案 0 :(得分:2)

我会尽力给你一个答案&#34;来自战壕&#34;。我使用SDN 3.x相当多,现在我使用4.x,我也使用spring数据mongo,它有@Indexed注释。

我同意,当您只想在属性上创建索引时非常方便。

但从长远来看,有几个问题。在部署和维护应用程序时,我不得不求助于在代码中管理索引,而不是声明性地。

这些包括

  • 重命名该属性,不会删除旧索引
  • 更改索引(例如,使其成为唯一约束)
  • 这些注释通常不提供本机数据库索引定义的所有可能性
  • 类层次结构 - 如果基类中的属性上有@Indexed,会创建哪些索引?仅适用于基类标签? (或在mongo收集),所有孩子......?

最后,您将一行@Indexed注释换成另一行

@Autowired
private Neo4jOperations operations;

@PostConstruct
public void createIndexesAndConstraints() {
    ...
    operations.query("CREATE INDEX ON :Person(email)", EMPTY_MAP);
    ...
}

答案 1 :(得分:1)

从SDN 4开始,索引管理被认为超出了映射框架的范围,建议在Spring之外进行管理。

更多信息:http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#reference_programming-model_indexing