【问题标题】:Spring Data JPA Transaction - No Transaction in progress - Spring Data Neo4jSpring Data JPA 事务 - 没有正在进行的事务 - Spring Data Neo4j
【发布时间】:2015-05-04 22:50:09
【问题描述】:

我想我遗漏了一些明显的东西。我正在尝试通过 JUnit 测试用例使实体持久化到数据库中,但是由于没有活动事务,它似乎没有持久化。

配置:

 @Configuration
    @EnableTransactionManagement
       public class TransactionConfig {

    @Inject 
    private EntityManagerFactory entityMangerFactory;

    @Bean
    public JpaTransactionManager transactionManager(){
        return new JpaTransactionManager(entityMangerFactory);
    }

测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { Application.class })
@ActiveProfiles(CommonConstants.SPRING_PROFILE_TEST)
@IntegrationTest
@WebAppConfiguration
public class UserRepositoryTest {

    @Inject
    UserRepository userRepo;

    @Test
    @Rollback(false)
    @Transactional("transactionManager")
    public void addUser() {
        User user = BootstrapDataPopulator.getUser();
        userRepo.save(user);
        System.out.println(user.getId()); //Successfully outputs the id generate by hibernate
        assertNotNull(user.getId());
    }
}

^此测试用例成功执行,但是我没有看到任何实体按预期保存在数据库中。

当我将 userRepo.save(user) 更改为 userRepo.saveAndFlush(user) 时,出现以下异常:

javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Spring Boot 自动配置报告http://dumptext.com/YcGaR3Wf

所有已初始化的 Spring Bean 的名称http://dumptext.com/jp9O6l8v

【问题讨论】:

  • 您为什么要自己配置@EnableTransactionManagementJpaTransactionManager? Spring Boot 已经为您做到了。删除您的 TransactionConfig 类我会说...此外,删除 @IntegrationTest 注释也不是集成测试。
  • M.Deinum 要让 Spring 在您的应用程序中启用任何事务管理,您需要拥有 @EnableTransactionManagement。您实际使用的特定 transactionManager 与此无关。因此,您需要 @EnableTransactionManagement 和 TransactionManager bean。更多信息:docs.spring.io/spring/docs/current/javadoc-api/org/…
  • 对于一个正常的 Spring 应用程序来说是正确的,但对于 Spring Boot 应用程序来说是不正确的,因为 Spring Boot 正在为您处理这些......
  • DataSourceTransactionManagerAutoConfiguration 与此无关,它必须是 JPA 的。您基本上在做的是使用框架,然后尝试不使用框架的功能,这对我来说似乎很愚蠢。
  • 是的,我记错了JpaBaseConfiguration#transactionManager,而不是DataSourceTransactionManagerAutoConfiguration。仅从框架中选择您想要的某些功能一点也不傻。 Spring Boot 的目的是让您快速构建应用程序原型。我不建议使用 Spring Boot 自动配置来运行完整的生产应用程序。 “自动配置是无创的,您可以随时开始定义自己的配置...”docs.spring.io/spring-boot/docs/current/reference/html/…

标签: spring spring-boot spring-data spring-data-jpa spring-transactions


【解决方案1】:

我也在我的应用程序中使用 Spring Data Neo4j (SDN)。 SDN 带有一个默认类 Neo4jConfiguration,它具有:

@Bean(name = {"neo4jTransactionManager","transactionManager"})
@Qualifier("neo4jTransactionManager")
public PlatformTransactionManager neo4jTransactionManager() throws Exception {
    return new JtaTransactionManagerFactoryBean(getGraphDatabaseService()).getObject();
}

“transactionManager”覆盖了我的 TransactionConfig 类中定义的 bean。因此,没有进行实体交易的原因。我停止使用 SDN 类 Neo4jConfiguration。这解决了我的问题。

【讨论】:

  • 你用什么来替换你停止使用的 Neo4jConfiguration 类?
  • 我刚刚复制了 Neo4jConfiguration.java 并删除了方法:neo4jTransactionManager() pastebin.com/tvSs7ViL
  • 这个类副本没有替代品吗?作为一个菜鸟,我有几个问题:Neo4J 可以重用 Spring Data 事务管理器吗?还是 Neo4J 应该使用自己的事务管理器?是否可以跨两个数据存储(JPA 和 Neo4J)进行事务处理?
  • 将在大约 8 小时内回复您的问题。盯着工作:)
  • 正如docs.spring.io/spring-data/neo4j/docs/current/reference/pdf/… 的 22.13 中所述,我希望“通过启用图形数据库的配置参数,让 Neo4j 使用 Neo4j 中的 Spring 支持参与外部配置的事务管理器。然后 Neo4j 将使用 Spring 的事务管理器而不是它自己的。”我的目标是stackoverflow.com/questions/32296676/…
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 2011-08-06
  • 2012-02-10
  • 2015-05-11
  • 2016-03-26
  • 2017-12-30
  • 2020-09-06
  • 2018-08-07
相关资源
最近更新 更多