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.
评论