Próbuję stworzyć aplikację z wykorzystaniem Springa i Hibernate. Sugeruję się m.in. tym tutorialem http://www.mkyong.com/spring-security/spring-security-hibernate-annotation-example/
Jednak ja korzystam z nowszej wersji Hibernate'a i musiałem dokonać paru zmian w klasie AppConfig. Wygląda ona u mnie tak:
@EnableWebMvc
@Configuration
@ComponentScan({ "com.myapp*" })
@EnableTransactionManagement
@Import({ SecurityConfig.class })
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean(name = "sessionFactory")
public SessionFactory sessionFactory(){
org.hibernate.cfg.Configuration configuration = getHibernateConfiguration();
StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
serviceRegistryBuilder.applySettings(configuration.getProperties());
StandardServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
@Bean(name = "hibernateCfg")
public org.hibernate.cfg.Configuration getHibernateConfiguration(){
org.hibernate.cfg.Configuration conf = new org.hibernate.cfg.Configuration();
conf.addAnnotatedClass(User.class);
conf.addAnnotatedClass(UserRole.class);
conf.setProperty("hibernate.format_sql", "true");
conf.setProperty("hibernate.show_sql", "true");
conf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
conf.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
conf.setProperty("hibernate.connection.url", "jdbc:mysql://127.0.0.1:3306/mydb");
conf.setProperty("hibernate.connection.username", "root");
conf.setProperty("hibernate.hbm2ddl.auto", "update");
return conf;
}
@Bean(name = "dataSource")
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/mydb");
ds.setUsername("root");
return ds;
}
@Bean
public HibernateTransactionManager transactionManager()
{
return new HibernateTransactionManager(sessionFactory());
}
}
Przy uruchamianiu aplikacji dostaję wyjątek
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class com.myapp.config.AppConfig: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.orm.hibernate4.HibernateTransactionManager com.myapp.config.AppConfig.transactionManager()] threw exception; nested exception is org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]
- Czy ktoś spotkał się z takim problemem? Udało mi się znaleźć informację, że taki problem występował w Springu 3.
- Czy poprawnie dostosowałem tę klasę do nowszej wersji Hibernate?
- Czy można zaimplementować DAO bez HibernateTransactionManagera?
Używam
Hibernate 4.3.6.Final
Spring 4.0.6.RELEASE