Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧Neo4j批次超过剩余部分_Java_Spring_Neo4j_Spring Data Neo4j - Fatal编程技术网

Java 弹簧Neo4j批次超过剩余部分

Java 弹簧Neo4j批次超过剩余部分,java,spring,neo4j,spring-data-neo4j,Java,Spring,Neo4j,Spring Data Neo4j,我在独立模式下使用Neo4j,在我的应用程序中使用Neo4j的Spring数据。我的代码需要能够确保,当我试图保存一个对象时,要么所有的东西都进入,要么什么都没有。我知道SpringNeo4j中的REST不支持事务,但Neo4j中的RESTAPI应该适合我当前的需要。虽然没有那么多操作,但整个save()调用必须是全有或全无 然而,Spring在默认情况下似乎不这样做。如果在写入期间发生运行时异常,则仍会有一些部分数据放入数据库中。我想继续使用GraphRespository接口,但如果这不可能

我在独立模式下使用Neo4j,在我的应用程序中使用Neo4j的Spring数据。我的代码需要能够确保,当我试图保存一个对象时,要么所有的东西都进入,要么什么都没有。我知道SpringNeo4j中的REST不支持事务,但Neo4j中的RESTAPI应该适合我当前的需要。虽然没有那么多操作,但整个save()调用必须是全有或全无

然而,Spring在默认情况下似乎不这样做。如果在写入期间发生运行时异常,则仍会有一些部分数据放入数据库中。我想继续使用GraphRespository接口,但如果这不可能,我想我可以手动实现它

下面是一些简化的示例代码来说明发生了什么

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;
  }
}
@NodeEntity
公共类测试对象{
@格拉希德
私人长id;
私有字符串名称;
@取回
@与(type=“SIBLING\u OF”,direction=direction.BOTH)相关
私人设置的兄弟姐妹;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
如果(名称=“失败”){
抛出新的RuntimeException();
}
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共集getsibles(){
返回兄弟姐妹;
}
公共无效设置边界(设置同级){
这个。兄弟姐妹=兄弟姐妹;
}
}
存储库

public interface TestRepository extends GraphRepository<TestObject>{}
public interface TestRepository扩展了graphrespository{}
测试

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();
  }
}
公共类测试{
@自动连线
回购协议;
公开募捐{
最终TestObject o1=新TestObject();
o1.设置名称(“good1”);
最终TestObject o2=新的TestObject();
o1.设置名称(“good2”);
最终TestObject o3=新的TestObject();
o1.设置名称(“good3”);
最终TestObject o4=新的TestObject();
o1.设置名称(“失败”);
o1.设置标签(新哈希集(){{
添加(o2);
添加(o3);
添加(o4);
}});
//抛出异常,但o1节点是在Neo4j中创建的
回购保存(o1);
}
公共静态void main(字符串[]args){
ApplicationContext appContext=新类路径XmlApplicationContext(“context.xml”);
Test t=(Test)appContext.getBean(“Test”);
t、 run();
}
}

SDN实际上不支持批处理API通过线路表示的“假”事务,因为它使用先读后写,这不起作用


目前,我建议您要么使用嵌入式DB运行SDN,要么使用SDN编写服务器扩展,并公开自定义REST端点。

我不希望采用嵌入式方式。您是否有指向SDN中一些服务器扩展示例的链接?或者,是否有方法重用SDN用于从POJO生成节点JSON的代码?如果我可以利用SDN已经做过的事情,我可以很容易地使用香草RESTAPI实现我自己的saveInBatch()方法。