gpt4 book ai didi

java - 使用 SpringRestGraphDatabase API 在事务中工作

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:41 24 4
gpt4 key购买 nike

我是图形数据库新手,在让 api 在事务中工作时遇到问题。

我有一个简单的代码,使用 neo4j graph db api 来创建节点和关系。我的代码在 JUnit 中运行,并尝试使用下面给出的开始和结束事务创建 2 个节点以及它们之间的关系。

代码在愉快的场景中运行良好。但是,如果代码中出现故障,节点仍会提交到图形数据库中。不确定我在这里是否做错了什么。我本来希望创建的 2 个节点会回滚。

这是代码片段:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })
public class RestBatchLoaderTest {

@Autowired
SpringRestGraphDatabase graphDatabaseService;

@Test
public void createNode() {
Transaction tx =graphDatabaseService.beginTx();

try {
Map<String,Object> nodeprops1 = new HashMap<String, Object>();
nodeprops1.put("name", "James Parker");
nodeprops1.put("age", Integer.valueOf(11));
Node james = graphDatabaseService.createNode(nodeprops1);
Assert.assertNotNull(james);

Map<String,Object> nodeprops2 = new HashMap<String, Object>();
nodeprops2.put("name", "Bing P");
nodeprops2.put("age", Integer.valueOf(34));
Node bing= graphDatabaseService.createNode(nodeprops2);

Node aa = null;
// Failure point: should rollback the previous node in the finally.
graphDatabaseService.remove(aa);


Map<String,Object> relprops = new HashMap<String, Object>();
RelationshipType type = new RelationshipType() {

@Override
public String name() {
return "MARRIED_TO";
}
};
graphDatabaseService.createRelationship(joe, jane, type, relprops);
tx.success();

} finally {
tx.finish();
}
}

graphDatabaseService 对象是使用 spring 配置 Autowiring 的。这是配置:

<neo4j:config graphDatabaseService="graphDatabaseService"/>
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
<constructor-arg value="http://localhost:7474/db/data/"/>
</bean>

此外,当在上面的代码中调用 graphDatabaseService.beginTx() 时,我注意到 tx 对象是 NullTransaction 的实例。

有什么想法吗?出了什么问题?

谢谢。

最佳答案

我想我已经弄清楚问题出在哪里了。配置需要启用批处理 - true。我还使用图形数据库对象的 RestAPI 包装器将其作为一个原子代码运行。请参阅下面的代码:

@Autowired
SpringRestGraphDatabase graphDatabaseService;

private RestAPI restAPI;

@Before
public void init(){
this.restAPI = ((RestGraphDatabase)graphDatabaseService).getRestAPI();
}

@Test
public void testEnableBatchTransactions() throws Exception {
System.setProperty(Config.CONFIG_BATCH_TRANSACTION,"true");
Transaction tx = restAPI.beginTx();
try {
Node n1 = restAPI.createNode(map("name", "node1"));
Node n2 = restAPI.createNode(map("name", "node2"));
Node n3 = restAPI.createNode(map("name", "node3"));
//String s = null;
//s.toString();
Node n4 = restAPI.createNode(map("name", "node4"));
tx.success();
} finally {
tx.finish();
}


assertTrue(tx instanceof BatchTransaction);
}

此外,System.setProperty(Config.CONFIG_BATCH_TRANSACTION,"true"); 启用批处理模式。

要对此进行测试,请尝试取消注释代码片段并运行测试。节点 n1n2n3 将不会在数据库中提交。

关于java - 使用 SpringRestGraphDatabase API 在事务中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com