[英]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.