2016-10-04 103 views
1

使用Spring和hibernate使用Java配置创建应用程序。尽管为这个错误提供了解决方案,但我无法理解@Configuration和HibernateException之间的关系。在我的代码中,我在服务上使用了@EnableTransactionManager和@Transaction。未使用@Configuration时,无法获取当前线程错误的事务同步会话。在什么情况下@Configuration是必需的?

下面是代码:

AppInitializer.java

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[]{HibernateConfiguration.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[]{SpringConfiguration.class}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 

} 

SpringConfiguration.java

@ComponentScan(basePackages = "com.o2o.project") 
public class SpringConfiguration { 

    @Bean(name="jspViewResolver") 
    public InternalResourceViewResolver getViewResolvers(){ 

     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("WEB-INF/view/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 


} 

HibernateConfiguration.java

@EnableTransactionManagement 
    @PropertySource(value={"classpath:database.properties"}) 
    public class HibernateConfiguration { 

     @Autowired 
     private Environment environment; 

     @Bean(name="sessionFactory") 
     public LocalSessionFactoryBean sessionFactory() { 
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
      sessionFactory.setDataSource(dataSource()); 
      sessionFactory.setPackagesToScan(new String[] { "com.o2o.project.model" }); 
      sessionFactory.setHibernateProperties(hibernateProperties()); 
      return sessionFactory; 
     } 

     @Bean(name="dataSource") 
     public DataSource dataSource(){ 
      DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
      dataSource.setDriverClassName(environment.getProperty("database.driver")); 
      dataSource.setUrl(environment.getRequiredProperty("database.url")); 
      dataSource.setUsername(environment.getRequiredProperty("database.user")); 
      dataSource.setPassword(environment.getRequiredProperty("database.password")); 
      return dataSource; 
     } 

     private Properties hibernateProperties(){ 
      Properties properties = new Properties(); 
      properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
      properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
      properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); 
      return properties;   
     } 

     @Bean(name="transactionManager") 
     public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { 
      HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
      transactionManager.setSessionFactory(sessionFactory); 
      return transactionManager; 
     } 

    } 

EmployeeServiceImpl.jav一个

@Service("employeeService") 
@Transactional 
public class EmployeeServiceImp implements EmployeeService { 

    @Autowired 
    private EmployeeDAO employeeDAD; 

    @Override 
    public void addEmployee(EmployeeModel employeeModel) { 
     employeeDAD.addEmployee(employeeModel); 
    } 

    @Override 
    public List<EmployeeModel> list() { 
     return employeeDAD.list(); 
    } 

    @Override 
    public EmployeeModel searchEmployee(int employeeID) { 
     return employeeDAD.searchEmployee(employeeID); 
    } 

} 

案例1 如果我注释类HibernateConfiguration与“@配置/ @组件”,那么它是工作没有抛出任何异常,否则我得到HibernateException的:无法获得交易同步会话当前线程。

案例2 即使尝试添加在SpringConfiguration如下面HibernateConfiguration类中定义的豆类,代码工作正常不与@Configuration注释SpringConfiguration:

@ComponentScan(basePackages = "com.o2o.project") 
@EnableTransactionManagement 
@PropertySource(value={"classpath:database.properties"}) 
public class SpringConfiguration { 

    @Bean(name="jspViewResolver") 
    public InternalResourceViewResolver getViewResolvers(){ 

     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("WEB-INF/view/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Autowired 
    private Environment environment; 

    @Bean(name="sessionFactory") 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.o2o.project.model" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean(name="dataSource") 
    public DataSource dataSource(){ 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getProperty("database.driver")); 
     dataSource.setUrl(environment.getRequiredProperty("database.url")); 
     dataSource.setUsername(environment.getRequiredProperty("database.user")); 
     dataSource.setPassword(environment.getRequiredProperty("database.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties(){ 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); 
     return properties;   
    } 

    @Bean(name="transactionManager") 
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
     transactionManager.setSessionFactory(sessionFactory); 
     return transactionManager; 
    } 

} 

即使我没有注释SpringConfiguration.class在使用@Configuration的AppInitializer的getServletConfigClasses()中提到,它工作正常。在我遇到的大多数文档中,有人提到@Configuration在定义类中的@Bean多于@Bean时使用,但在没有使用@Configuration注释的情况2下它工作正常。

为什么我在删除@ Configuration/@ Component时收到上述异常。什么时候应该使用@Configuration?我真的很困惑,当@Configuration是必需的?

回答

0

由于您没有使用弹簧配置XML文件,并在下面的配置标签

<beans> 
     <context:annotation-config/> 
     <bean class="yourpackge.HibernateConfiguration"/> 
    </beans> 

所以,你必须使用@Configuration,那么只有你@Bean@Autowired注解的方法会得到bean定义和服务请求在运行时你的申请。

在你有getServletConfigClasses()有那么它不需要与@Configuration

到annotanate因此,它显然意味着对于任何Bean定义这需要有@Configuration@Component annotanation

你没有任何 @Bean@Autowired annotanation其他案例

我认为它澄清了你的疑问。

+0

即使尝试了另一种方式,通过添加SpringConfiguration中HibernateConfiguration类中定义的bean并删除了HibernateConfiguration。java文件 - (请参阅案例2)。仍然不需要使用@Configuration注释SpringConfiguration。 –

+0

是的,但在**情况2 **中,您已在** SpringConfiguration **类中使用_ @ ComponentScan_进行了注释,它将自己配置为配置类,因此您不一定需要提及_ @ Configuration_。如果你删除了_ @ ComponentScan_,那么你将会遇到异常。 – Tanveer

相关问题