Spring 4.1 to 4.2 migrattion : Why the persistence does not work?

144 Views Asked by At

I used Spring 4.1.0 with Hibernate 4.3.6 and all is Ok. After Spring migration to 4.2.8, the persistence does not work. No exception, no trace the persist methode of entity manager is called but nothing in the database. It's like if the transaction manager was not working.

this is my persistence configuration :

@Configuration 
@EnableTransactionManagement 
public class PersistenceConfiguration {
    @Bean
    public BasicDataSource driverManagerDataSource() {
        final BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/xxx");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setDefaultAutoCommit(false);
        dataSource.setInitialSize(10);
        dataSource.setMaxActive(20);
        dataSource.setMaxIdle(10); 
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() {
        final LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

        localContainerEntityManagerFactoryBean.setDataSource(driverManagerDataSource());
        localContainerEntityManagerFactoryBean.setPersistenceUnitName("xxxPersistenceUnitName");
        localContainerEntityManagerFactoryBean.setPackagesToScan("org.xxx.model");
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(new org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter());
        final HashMap<String, String> map = new HashMap<>();

        map.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        map.put("hibernate.hbm2ddl.auto", "update");

        map.put("hibernate.show_sql", "false");
        map.put("hibernate.format_sql", "false");
        localContainerEntityManagerFactoryBean.setJpaPropertyMap(map);
        localContainerEntityManagerFactoryBean.setJpaDialect(new org.springframework.orm.jpa.vendor.HibernateJpaDialect());
        return localContainerEntityManagerFactoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        final JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(localContainerEntityManagerFactoryBean().getNativeEntityManagerFactory());
        return jpaTransactionManager;
    }

Dependence injection :

@Configuration
@Import({PersistenceConfiguration.class, UserConfiguration.class, SecurityConfiguration.class})
@ComponentScan(basePackages = "org.xxx")
@EnableWebMvc
public class XxxProjectConfiguration {

    private static Logger LOG = Logger.getLogger(XxxProjectConfiguration.class);

    @Autowired
    private Environment env;

    @PostConstruct
    public void initApp() {
        LOG.debug("Looking for Spring profiles...");
        if (env.getActiveProfiles().length == 0) {
            LOG.info("No Spring profile configured, running with default configuration.");
        } else {
            for (String profile : env.getActiveProfiles()) {
                LOG.info("Detected Spring profile: {}" + profile);
            }
        }
    }

    @Autowired
    private UserConfiguration userConfiguration;


    // DAO

    @Bean
    public RelationshipDAO relationshipDAO() {
        return new RelationshipDAOImpl();
    }

    @Bean
    public RelationshipStatusDAO relationshipStatusDAO() {
        return new RelationshipStatusDAOImpl();
    }

    @Bean
    public MessageDAO messageDAO() {
        return new MessageDAOImpl();
    }

    // Services

    @Bean
    public UserServiceImpl userService() {
        return new UserServiceImpl(userConfiguration.userDAO(), relationshipDAO(), relationshipStatusDAO(), messageDAO());
    }

}

And

@Configuration
@Import(PersistenceConfiguration.class)
public class UserConfiguration {

    @Bean
    public UserDAO userDAO() {
        return new UserDAOImpl();
    }

}

The service :

@Transactional(propagation=Propagation.SUPPORTS)
public class UserServiceImpl implements UserService, Serializable {

    private static final long serialVersionUID = 1L;

    private UserDAO userDAO;
    private RelationshipDAO relationshipDAO;
    private RelationshipStatusDAO relationshipStatusDAO;
    private MessageDAO messageDAO;

    public UserServiceImpl(final UserDAO userDAO, final RelationshipDAO relationshipDAO, final RelationshipStatusDAO relationshipStatusDAO, final MessageDAO messageDAO) {
        this.userDAO = userDAO;
        this.relationshipDAO = relationshipDAO;
        this.relationshipStatusDAO = relationshipStatusDAO;
        this.messageDAO = messageDAO;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = UserServiceException.class)
    public RelationshipStatus wantsRelationship(final long fromUserId, final long toUserId) throws UserServiceException {
        try {
            final Relationship relationship = new Relationship(new Date());

            User fromUser = userDAO.get(fromUserId);        
            User toUser = new User(toUserId);

            relationship.getUsers().add(fromUser);
            fromUser.getRelationships().add(relationship);

            relationship.getUsers().add(toUser);
            toUser.getRelationships().add(relationship);

            relationship.setWantsFromUserId(fromUserId);

            final Message message = new Message(fromUserId, "Hi ! My name is " + fromUser.getFirstName() + ", I want to meet you");
            relationship.getMessages().add(message);

            relationship.setStatus(new RelationshipStatus(Status.WANTS));

            relationshipDAO.persist(relationship);
            return relationship.getStatus();
        } catch (Exception e) {
            throw new UserServiceException(e);
        }
    }

... 

}

I do not understand anything...

1

There are 1 best solutions below

0
On BEST ANSWER

The missing code is :

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);

    return transactionManager;
}