当前位置: 首页 > 知识库问答 >
问题:

无法配置@Transaction以使用Spring Data Neo4j

韩刚洁
2023-03-14

我试图在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中更改模式...),但没有任何帮助。

如果你能告诉我我做错了什么,我将不胜感激。

提前感谢!

共有1个答案

蒋曾笑
2023-03-14

我找到了原因。。。SDN在交易条款中不支持最新的Neo4j。我相信这是因为neo4j内核中的SpringTransactionManager已经在2.2版本中发布了,但不是百分之百确定。

在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类从配置中的Neo4jConfiguration重写neo4jTransactionManager方法:

    @Override
public PlatformTransactionManager neo4jTransactionManager(GraphDatabaseService graphDatabaseService) {
    Neo4jEmbeddedTransactionManager newTxMgr = new Neo4jEmbeddedTransactionManager(graphDatabaseService());
    UserTransaction userTransaction = new UserTransactionAdapter( newTxMgr );

    return new JtaTransactionManager( userTransaction, newTxMgr );
}
 类似资料:
  • 我正在尝试配置一个简单的JPA项目,我被卡住了。 我有一个工作数据源(MySQL) 我做了以下步骤(Intellij生成的所有文件): > 导入具有学生表的数据库。 使用Intellij IDE生成实体类。 从Maven导入Hibernate-entityManager库。 导入MySQL连接器。 尝试运行一个简单的JPA程序来创建新行,但我得到了一个例外: 没有名为persistenceUnit

  • 问题内容: 似乎log4j试图通过XML解析器解析.json配置文件,但是为什么呢? 我通过命令行参数设置log4j配置文件: 文件内容: 我得到的是: 我的lib文件夹中的Jar: hamcrest-junit-2.0.0.0.jar jackson-annotations-2.6.1.jar Jackson core-2.6.1.jar jackson-databind-2.6.1.jar j

  • 我无法在android studio中配置Kotlin。获取错误错误:找不到方法com。Android建筑格拉德尔。内部的变种BaseVariantData。getOutputs()Ljava/util/List;'。

  • 问题内容: 当我尝试使用以下设置通过Flask-Mail将电子邮件发送到Gmail的SMTP服务器时,我得到了。如何修改我的配置以通过Gmail发送电子邮件? 问题答案: 服务器是“ smtp.gmail.com”。 端口必须与使用的安全性类型匹配。 如果将STARTTLS与一起使用,请使用。 如果直接将SSL / TLS与一起使用,则使用。 同时启用STARTTLS或SSL / TLS。 根据你

  • 我无法为配置要使用的服务器列表。我使用的是Spring Cloud Netflix,但是这个特定的服务()没有在Eureka注册。因此,我需要在YML文件中为配置服务器列表。 但是,永远不会读取,因此操作失败,因为Faigns/Ribbon没有一个服务器可以使用。 我做错了什么? 我的假客户: 在引导中。yml: 如何在Spring Boot应用程序中配置Faigns客户端:

  • 错误: > 连客户端都没有启动 http://localhost:8080/ 将spring.config.import=configServer:属性添加到您的配置中。如果不需要配置,则添加spring.config.import=optional:configserver:。要禁用此检查,请设置spring.cloud.config.enabled=false或spring.cloud.con