2014-02-01 3 views
0

Я использую Neo4j в автономном режиме с данными Spring для Neo4j в моем приложении. Мой код должен быть в состоянии убедиться, что когда я пытаюсь сохранить объект, либо все идет, либо ничего не делает. Я знаю, что транзакции не поддерживаются в REST в Spring Neo4j, но batch operation в REST API Neo4j должны быть хорошими для моих текущих потребностей. Существует не так много операций, но весь вызов save() должен быть ничего или ничего.Весна Neo4j партия над REST

Однако, похоже, что 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; 
    } 
} 

Repository

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(); 
    } 
} 

ответ

0

SDN действительно не поддерживает «поддельные» транзакции, которые пакетный API представляет по кабелю, поскольку он использует чтение после записи, и это не работает.

На данный момент я бы предпочел, чтобы вы либо запускали SDN со встроенной БД, либо пишете расширение сервера с использованием SDN и выставляете пользовательскую конечную точку REST.

+0

Я бы предпочел не идти по встроенному маршруту. У вас есть ссылка на некоторые примеры расширений сервера в SDN? – monitorjbl

+0

Альтернативно, существует ли способ повторного использования кода, который использует SDN для создания узла JSON из POJO? Я мог бы довольно легко реализовать свой собственный метод saveInBatch() с использованием API-интерфейса Rational, если бы мог воспользоваться тем, что SDN уже делает. – monitorjbl

Смежные вопросы