Spring 4.1到4.2迁移:为什么持久性不起作用?

时间:2016-12-16 21:41:15

标签: spring-transactions

我使用Spring 4.1.0和Hibernate 4.3.6,一切都很好。 在Spring迁移到4.2.8之后,持久性不起作用。 没有例外,没有跟踪实体管理器的持久性方法被调用但数据库中没有任何内容。 就像交易经理不工作一样。

这是我的持久性配置:

@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;
    }

依赖注射:

@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());
    }

}

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

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

}

服务:

@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);
        }
    }

... 

}

我什么都不懂......

1 个答案:

答案 0 :(得分:0)

缺少的代码是:

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

    return transactionManager;
}