Spring Data JPA Transaction - 没有正在进行的事务 - Spring Data Neo4j

时间:2015-03-04 03:23:35

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

我想我错过了一些明显的东西。我试图让一个实体通过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

1 个答案:

答案 0 :(得分:0)

我也在我的应用程序中使用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。这解决了我的问题。