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 파일 이후
SpringConfiguration의 HibernateConfiguration 클래스에 정의 된 빈을 추가하고 HibernateConfiguration을 제거하여 다른 방법으로 시도해 보았다.자바 파일 - (사례 2를 참조하십시오). SpringConfiguration에 @Configuration 주석을 달 필요가 없었습니다. –
예, ** 케이스 2 **에서는 ** SpringConfiguration ** 클래스의 _ @ ComponentScan_으로 주석을 달았습니다.이 클래스는 구성 클래스로 구성되므로 반드시 _ @ Configuration_을 언급 할 필요가 없습니다. _ @ ComponentScan_을 제거한 경우에도 예외가 발생합니다. – Tanveer