我知道从标题来看,这听起来像是this question的副本,但我保证你不是。实际上,@Indexed(unique=true)
正在正常工作,因为它正在捕获重复项!但是,在创建第一个节点时,Spring实际上是以某种方式创建了两个节点。这就是我正在做的事情:
@Autowired
private MyEntityRepository repo;
public void testCreate(){
MyEntity me = new MyEntity();
me.setName("somename");
me.setDescription("blah blah");
repo.save(me);
}
@NodeEntity
public class MyEntity{
@GraphId
private Long id;
@Indexed(unique=true)
private String name;
private String description;
}
在空数据库上运行后,将抛出DataIntegrityViolationException
并创建两个节点。具有最低ID的那个将具有其上的名称和描述字段,但是另一个节点将仅具有名称字段。奇怪的是,名称字段在两个节点中具有相同的值,因此即使抛出异常,它仍然尝试创建节点。如果我取消@Indexed
注释,一切正常,只创建一个节点(但显然没有重复的预防)。
我使用的是独立的Neo4j服务器,因为此应用程序的其他几个部分需要能够访问它。但是,我注意到嵌入式Neo4j服务器不会出现这种情况。我真的希望在Spring over HTTP上支持这样一个有用的功能,但如果它没有,我不会感到惊讶。有没有办法使这项工作?
答案 0 :(得分:1)
Spring Data Neo4j over HTTP并不真正使用事务。您使用什么SDN版本?
我尝试使用Neo4j服务器的独特创建工具,通常可行。
您可以共享完整的堆栈跟踪,也可以查看服务器日志中的任何问题。