[英]Spring Neo4j batch over REST
我在独立模式下使用Neo4j,在我的应用程序中使用Spring Data for Neo4j。 我的代码必须能够确保当我尝试保存对象时,一切都进行了,否则什么也没做。 我知道Spring Neo4j中的REST不支持事务,但是Neo4j的REST API中的批处理操作应该可以满足我当前的需求。 没有太多的操作,但是整个save()调用需要全部解决。
但是,Spring默认情况下似乎不执行此操作。 如果在写入过程中发生RuntimeException,则数据库中仍将放置一些部分数据。 我想继续使用GraphRepository接口,但是如果这不可能,我想我可以手动实现。
这是一些简化的示例代码,以说明发生了什么
POJO :
@NodeEntity
public class TestObject {
@GraphId
private Long id;
private String name;
@Fetch
@RelatedTo(type = "SIBLING_OF", direction = Direction.BOTH)
private Set<TestObject> siblings;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
if (name == "fail") {
throw new RuntimeException();
}
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<TestObject> getSiblings() {
return siblings;
}
public void setSiblings(Set<TestObject> siblings) {
this.siblings = siblings;
}
}
资料库
public interface TestRepository extends GraphRepository<TestObject>{}
测试
public class Test {
@Autowired
TestRepository repo;
public void run() {
final TestObject o1 = new TestObject();
o1.setName("good1");
final TestObject o2 = new TestObject();
o1.setName("good2");
final TestObject o3 = new TestObject();
o1.setName("good3");
final TestObject o4 = new TestObject();
o1.setName("fail");
o1.setSiblings(new HashSet<TestObject>() {{
add(o2);
add(o3);
add(o4);
}});
//throws exception, but o1 node is created in Neo4j
repo.save(o1);
}
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("context.xml");
Test t = (Test) appContext.getBean("test");
t.run();
}
}
SDN并不真正支持批处理API通过线表示的“虚假”事务,因为它使用写后读的方式,但这是行不通的。
现在,我宁愿建议您使用嵌入式DB运行SDN或使用SDN编写服务器扩展并公开自定义REST端点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.