2016-12-16 32 views
0

我用Spring 4.1.0和Hibernate 4.3.6,一切正常。 在Spring遷移到4.2.8之後,持久性不起作用。 沒有例外,沒有追蹤實體管理器的持久方法被調用,但沒有在數據庫中。 這就好像事務管理器不工作。春季4.1到4.2遷移:爲什麼持久性不起作用?

這是我的持久性配置:

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

... 

} 

我什麼都不懂......

回答

0

缺少的代碼是:

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

    return transactionManager; 
}