Spring数据Neo4J @索引(唯一=真)不起作用

hlswsv35  于 2023-03-12  发布在  Spring
关注(0)|答案(4)|浏览(177)

我想使用户节点中的userName属性是唯一的。我使用了下面的代码,但它没有在Neo4j数据库中创建唯一约束。

@Property(name = "name")
@Index(unique = true)
private String usreName;

仅供参考,我使用的是Neo4j Server版本:3.3.6(社区)使用Sping Boot 2.
但如果我自己在Neo4j浏览器中创建一个约束,它就可以工作。

CREATE CONSTRAINT ON (user:User) ASSERT user.userName IS UNIQUE

有没有一种方法可以强制Spring Data Neo4J创建唯一的属性,而不是自己在Database中创建它们?

00jrzges

00jrzges1#

如果希望应用程序代码创建约束,则需要配置自动索引管理器。您可以在文档中找到最适合的选项:https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#reference:indexing:creation
关于此主题,请注意:想想Hibernate的DDL支持这样的自动索引创建,它是开发时的一个助手,在生产环境中不应该使用assertupdate,而应该只使用validate

n8ghc7c1

n8ghc7c12#

原因

在SpringDataNeo4j4中,索引管理问题完全从Map框架中移除。
(from Spring Data中的索引管理(Neo4j)
溶液

@Autowired
private SessionFactory sessionFactory;

@PostConstruct
public void createIndexesAndConstraints() {
    Session session = sessionFactory.openSession();
    Result result = session.query("CREATE INDEX ON :User(userName)", Collections.EMPTY_MAP);
}
qyuhtwio

qyuhtwio3#

您可以通过application.properties配置自动索引管理器的工作模式

spring.data.neo4j.auto-index=validate # or
# spring.data.neo4j.auto-index=update
# spring.data.neo4j.auto-index=assert

默认模式是none,除此之外,@meistermeier说的也适用。
此外,Neo4jOperations在SDN 4中被弃用,并已在SDN 5中删除。对于“接近”数据库的操作,请改用Session

eblbsuwk

eblbsuwk4#

谢谢你的回答,但我还有3个问题:
1-我使用的是Sping Boot 2,但是在类路径中看不到Neo4jOperations,无法导入它。
2-我应该把它放在我的Entity节点中还是放在另一个bean中?
3-在运行我的应用程序两次或更多次之后呢?我认为这会导致第二次或更多次的异常。

相关问题