Pedro Dusso
Pedro Dusso

Reputation: 2140

CrudRepository save method not returning updated entity

I'm working with Spring and in it spring-data-jpa:1.7.0.RELEASE and hibernate-jpa-2.1-api:1.0.0.Final. My database is a MySQL. In a integration test, when I save an entity, the entityRepository.save() method does not return a update version of it (with the auto-incremented id populated for example), thus I can see it is in the database.

Here's my configuration class:

//@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "core.repository")
@Configuration
@PropertySource("classpath:application.properties")
public class JPAConfiguration {

    @Autowired
    private Environment env;

    private
    @Value("${db.driverClassName}")
    String driverClassName;
    private
    @Value("${db.url}")
    String url;
    private
    @Value("${db.username}")
    String user;
    private
    @Value("${db.password}")
    String password;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();

    }

    @Bean
    public DataSource dataSource() {

        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setDatabasePlatform(env.getProperty("hibernate.dialect"));

        final LocalContainerEntityManagerFactoryBean em =
                new LocalContainerEntityManagerFactoryBean();

        em.setJpaVendorAdapter(vendorAdapter);
        em.setPackagesToScan(new String[]{"core.persistence"});
        em.setDataSource(dataSource());
        em.afterPropertiesSet();


        return em;
    }

    @Bean
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Bean
    public JpaTransactionManager transactionManager(final EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}

Here's my test class:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JPAConfiguration.class})
//@Transactional
//@TransactionConfiguration(defaultRollback = true)
public class AgencyRepositoryIntegrationTests {

    @Autowired
    AgencyRepository agencyRepository;

    @Test
    public void testThatAgencyIsSavedIntoRepoWorks() throws Exception {

        Agency c = DomainTestData.getAgency();
        Agency d = agencyRepository.save(c);
        // here d equals to c but both have id 0.

        Collection<Agency> results = Lists.newArrayList(agencyRepository.findAll());
        //here results != null and it does contain the agency object.
        assertNotNull(results);
    }
}

I end up commenting the Transactional annotations (both in the test and in the configuration class) due to research other questions in stackoverflow, but it did not work.

Thanks

Upvotes: 3

Views: 14275

Answers (2)

Desorder
Desorder

Reputation: 1539

Try to uncomment your @Transactional annotation and run. I can't see any visible problem in your snippet but there is something inside me (and it's not hunger) saying that your transaction demarcation is not right. I had similar problems like this before and it was just @transaction annotations missing or transaction misconfiguration.

Upvotes: 1

uaiHebert
uaiHebert

Reputation: 1912

Use saveAndFlush method to make sure that the entity is in the database.

Make sure to add @Transactional to your methods if a NoTransactionException appears.

Upvotes: 0

Related Questions