2016-10-04 2 views
1

Java 구성을 사용하여 Spring을 사용하여 응용 프로그램을 만들고 최대 절전 모드로 만듭니다. 이 오류에 대한 해결책이 있지만 @Configuration과 HibernateException 사이의 관계를 이해할 수는 없습니다. 내 코드에서는 Services에서 @EnableTransactionManager와 @Transaction을 사용했습니다.@Configuration을 사용하지 않을 때 현재 스레드 오류에 대한 트랜잭션 동기화 세션을 가져올 수 없습니다. 어떤 경우 @Configuration이 필요합니까?

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

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[]{"/"}; 
    } 

} 

: 아래

코드입니다

@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 내가 "@ 구성/@ 구성 요소"다음 그렇지 않으면 내가 HibernateException이 무엇입니까 예외를 throw하지 않고 노력과 클래스 HibernateConfiguration 주석하고 경우에 대한 트랜잭션 동기화 세션을 얻을 수 없습니다 현재 스레드. 내가 SpringConfiguration.class 주석을하고 있지 않다하더라도

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

} 

을 :

사례 2 심지어 코드는 @Configuration과 SpringConfiguration 주석없이 잘 작동, 아래 SpringConfiguration에 HibernateConfiguration 클래스에 정의 된 콩을 추가하는 시도 @Configuration과 함께 AppInitializer의 getServletConfigClasses()에서 언급했듯이 정상적으로 작동합니다. 대부분의 문서에서 @Configuration은 클래스에서 @Bean 이상을 정의 할 때 사용되지만 @Configuration을 사용하지 않고 케이스 2에서 제대로 작동합니다.

왜 @ Configuration/@ Component를 제거 할 때 위의 예외가 발생합니다. @Configuration은 무엇을 언제 사용해야합니까? @Configuration이 필요할 때 나는 혼란 스럽다. 당신의 사용하지 않는 스프링 설정 XML 파일 이후

답변

0

아래 설정 태그

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

그래서 당신은 단지 당신의 @Bean@Autowired 주석 방법의 실행시에 빈 정의 및 서비스 요청을 얻을 것이다, @Configuration을 사용해야합니다 너의 어플리케이션. 당신이 getServletConfigClasses()을 가진이 그래서는 분명히 어떤 콩이 정의를 사용하면 @Configuration@Component annotanation

을 가질 필요가 있다는 것을 의미 @Configuration

와 annotanate 필요가 없습니다 귀하의 어떤 @Bean 또는 @Autowired annotanation을 가지고 있지 다른 경우

나는 그것이 당신의 의심을 분명히한다고 생각합니다.

+0

SpringConfiguration의 HibernateConfiguration 클래스에 정의 된 빈을 추가하고 HibernateConfiguration을 제거하여 다른 방법으로 시도해 보았다.자바 파일 - (사례 2를 참조하십시오). SpringConfiguration에 @Configuration 주석을 달 필요가 없었습니다. –

+0

예, ** 케이스 2 **에서는 ** SpringConfiguration ** 클래스의 _ @ ComponentScan_으로 주석을 달았습니다.이 클래스는 구성 클래스로 구성되므로 반드시 _ @ Configuration_을 언급 할 필요가 없습니다. _ @ ComponentScan_을 제거한 경우에도 예외가 발생합니다. – Tanveer

관련 문제