Use native Hibernate 4 API
In Spring 3.1, a new package named org.springframework.orm.hibernate4 is included( in spring-orm maven dependency). With this new APIs, using Hibernate 4 in Spring projects becomes more easy than before, you are not required to extend the HiberanteDaoSupport class or use HibernateTemplate in your implemnetation class.Only a simple registration is required in Spring configuration, you can use the Hibernate native Session API freely in your Spring projects.
-
Register a DataSource bean
<jdbc:embedded-database id="dataSource" > </jdbc:embedded-database>
-
Declare Spring specific LocalSessionFactoryBean bean.
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com.hantsylabs.example.spring.model</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect hibernate.format_sql=true hibernate.show_sql=true hibernate.hbm2ddl.auto=create </value> </property> </bean>
The legacy Spring Hibernate3 integration provides two version of SessionFactoryBean, ~.hibernate3.LocalSessionFactoryBean targets the legacy Hibernate XML mapping configuration, ~.hibernate3.annotation.AnnotationSessionFactoryBean is use for annotation based configuration.
-
Register a transaction manager.
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
-
Now you can inject SessionFactory in your implementation class freely.
@Repository public class Hibernate4ConferenceDaoImpl implements ConferenceDao { private static final Logger log = LoggerFactory .getLogger(Hibernate4ConferenceDaoImpl.class); @Autowired SessionFactory sessionFactory; private Session session() { return sessionFactory.getCurrentSession(); } @Override public Conference findById(Long id) { return (Conference) session().load(Conference.class, id); } // other methods... }
It is very simple and stupid. All the codes are based on Hibernate Session APIs now.
NOTE: Hibernate 3 also can be configured like these, I do not demonstrate the steps here.
The following is an example of the Java configuration, it is equivalent to the XML format above.
@Configuration @ComponentScan(basePackages={"com.hantsylabs.example.spring.dao","com.hantsylabs.example.spring.hibernate4"}) public class HibernateConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder().build(); } @Bean public SessionFactory sessionFactory() { LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder( dataSource()); builder.scanPackages("com.hantsylabs.example.spring.model") .addProperties(hibernateProperties()); return builder.buildSessionFactory(); } private Properties hibernateProperties() { Properties extraProperties = new Properties(); extraProperties.put("hibernate.format_sql", "true"); extraProperties.put("hibernate.show_sql", "true"); extraProperties.put("hibernate.hbm2ddl.auto", "create"); return extraProperties; } @Bean public PlatformTransactionManager transactionManager() { return new HibernateTransactionManager(sessionFactory()); } }The configuration class is annotated with annotation @Configuration. In this class, a DataSource bean, a SessionFactoryBean, a TransactionManager bean are defined respectively. A EmbeddedDatabaseBuilder is provided to produce a DataSource bean, a LocalSessionFactoryBuilder is designated for building a SessionFactory bean. The Builder pattern is more friendly for setting some properties.
Check out the codes from my github.com, https://github.com/hantsy/spring-sandbox.
评论