无法配置 @Transaction 以使用 Spring Data Neo4j
Cannot configure @Transaction to work with Spring Data Neo4j
我试图在我的 Neo4j 应用程序中从手动管理的事务转移到基于注释的事务。
我已经准备好基于注解的Spring配置文件:
@Configuration
@EnableNeo4jRepositories("xxx.yyy.neo4jplanetspersistence.repositories")
@ComponentScan(basePackages = "xxx.yyy")
@EnableTransactionManagement
public class SpringDataConfiguration extends Neo4jConfiguration
implements TransactionManagementConfigurer{
public SpringDataConfiguration() {
super();
setBasePackage(new String[] {"xxx.yyy.neo4jplanetspojos"});
}
@Bean
public GraphDBFactory graphDBFactory(){
GraphDBFactory graphDBFactory = new GraphDBFactory();
return graphDBFactory;
}
@Bean
public GraphDatabaseService graphDatabaseService() {
return graphDBFactory().getTestGraphDB(); //new GraphDatabaseFactory().newEmbeddedDatabase inside
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return neo4jTransactionManager(graphDatabaseService());
}
}
我用@Transactional 标记了我的存储库:
@Transactional
public interface AstronomicalObjectRepo extends
GraphRepository<AstronomicalObject>{
}
我用 @Transactional 标记了我的单元测试 类 和测试方法,并注释了用于手动管理事务的旧代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringDataConfiguration.class},
loader = AnnotationConfigContextLoader.class)
@Transactional
public class AstronomicalObjectRepoTest {
@Autowired
private AstronomicalObjectRepo repo;
@Autowired
private Neo4jTemplate neo4jTemplate;
(...)
@Test @Transactional
public void testSaveAndGet() {
//try (Transaction tx =
//neo4jTemplate.getGraphDatabaseService().beginTx()) {
AstronomicalObject ceres = new AstronomicalObject("Ceres",
1.8986e27, 142984000, 9.925);
repo.save(ceres); //<- BANG! Exception here
(...)
//tx.success();
//}
}
更改后测试未通过。
我收到:
org.springframework.dao.InvalidDataAccessApiUsageException: 嵌套异常是 org.neo4j.graphdb.NotInTransactionException
我尝试了很多不同的事情(在@Transactional 注释中明确命名事务管理器,在@EnableTransactionManagment 中更改模式...),没有任何帮助。
如果能提供有关我做错了什么的线索,将不胜感激。
提前致谢!
我找到原因了...
SDN 在事务方面不支持最新的 Neo4j。
我相信这是因为 neo4j-kernel 中的 SpringTransactionManager 已经进入 2.2+ 版本,但不是 100% 确定。
在 github 我们可以看到 7 小时前进行了更改以修复它:
https://github.com/spring-projects/spring-data-neo4j/blob/master/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java
一个对我有用的快速修复是在我的配置中使用 Neo4jEmbeddedTransactionManager class:
覆盖 Neo4jConfiguration 中的 neo4jTransactionManager 方法
@Override
public PlatformTransactionManager neo4jTransactionManager(GraphDatabaseService graphDatabaseService) {
Neo4jEmbeddedTransactionManager newTxMgr = new Neo4jEmbeddedTransactionManager(graphDatabaseService());
UserTransaction userTransaction = new UserTransactionAdapter( newTxMgr );
return new JtaTransactionManager( userTransaction, newTxMgr );
}
我试图在我的 Neo4j 应用程序中从手动管理的事务转移到基于注释的事务。
我已经准备好基于注解的Spring配置文件:
@Configuration
@EnableNeo4jRepositories("xxx.yyy.neo4jplanetspersistence.repositories")
@ComponentScan(basePackages = "xxx.yyy")
@EnableTransactionManagement
public class SpringDataConfiguration extends Neo4jConfiguration
implements TransactionManagementConfigurer{
public SpringDataConfiguration() {
super();
setBasePackage(new String[] {"xxx.yyy.neo4jplanetspojos"});
}
@Bean
public GraphDBFactory graphDBFactory(){
GraphDBFactory graphDBFactory = new GraphDBFactory();
return graphDBFactory;
}
@Bean
public GraphDatabaseService graphDatabaseService() {
return graphDBFactory().getTestGraphDB(); //new GraphDatabaseFactory().newEmbeddedDatabase inside
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return neo4jTransactionManager(graphDatabaseService());
}
}
我用@Transactional 标记了我的存储库:
@Transactional
public interface AstronomicalObjectRepo extends
GraphRepository<AstronomicalObject>{
}
我用 @Transactional 标记了我的单元测试 类 和测试方法,并注释了用于手动管理事务的旧代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringDataConfiguration.class},
loader = AnnotationConfigContextLoader.class)
@Transactional
public class AstronomicalObjectRepoTest {
@Autowired
private AstronomicalObjectRepo repo;
@Autowired
private Neo4jTemplate neo4jTemplate;
(...)
@Test @Transactional
public void testSaveAndGet() {
//try (Transaction tx =
//neo4jTemplate.getGraphDatabaseService().beginTx()) {
AstronomicalObject ceres = new AstronomicalObject("Ceres",
1.8986e27, 142984000, 9.925);
repo.save(ceres); //<- BANG! Exception here
(...)
//tx.success();
//}
}
更改后测试未通过。 我收到: org.springframework.dao.InvalidDataAccessApiUsageException: 嵌套异常是 org.neo4j.graphdb.NotInTransactionException
我尝试了很多不同的事情(在@Transactional 注释中明确命名事务管理器,在@EnableTransactionManagment 中更改模式...),没有任何帮助。
如果能提供有关我做错了什么的线索,将不胜感激。
提前致谢!
我找到原因了... SDN 在事务方面不支持最新的 Neo4j。 我相信这是因为 neo4j-kernel 中的 SpringTransactionManager 已经进入 2.2+ 版本,但不是 100% 确定。
在 github 我们可以看到 7 小时前进行了更改以修复它: https://github.com/spring-projects/spring-data-neo4j/blob/master/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/JtaTransactionManagerFactoryBean.java
一个对我有用的快速修复是在我的配置中使用 Neo4jEmbeddedTransactionManager class:
覆盖 Neo4jConfiguration 中的 neo4jTransactionManager 方法 @Override
public PlatformTransactionManager neo4jTransactionManager(GraphDatabaseService graphDatabaseService) {
Neo4jEmbeddedTransactionManager newTxMgr = new Neo4jEmbeddedTransactionManager(graphDatabaseService());
UserTransaction userTransaction = new UserTransactionAdapter( newTxMgr );
return new JtaTransactionManager( userTransaction, newTxMgr );
}