使用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是必需的?
即使尝试了另一种方式,通过添加SpringConfiguration中HibernateConfiguration类中定义的bean并删除了HibernateConfiguration。java文件 - (请参阅案例2)。仍然不需要使用@Configuration注释SpringConfiguration。 –
是的,但在**情况2 **中,您已在** SpringConfiguration **类中使用_ @ ComponentScan_进行了注释,它将自己配置为配置类,因此您不一定需要提及_ @ Configuration_。如果你删除了_ @ ComponentScan_,那么你将会遇到异常。 – Tanveer