Spring学习——(六)Spring与Hibernate整合

来源:互联网 发布:mac开机后鼠标不能动 编辑:程序博客网 时间:2024/05/17 23:56

前面几部分已经基本介绍了Spring的IoC和AOP两大特性,下面就要开始研究和Hibernate等其他框架的整合。

首先来整合Hibernate。在实验中,我采用的是Spring4.2.5和Hibernate4.3.11。在Spring的参考文档中“Object Relational 

Mapping (ORM) Data Access”一章讲了和ORM的整合,包括Hibernate、JPA、JDO等。在Spring4.2.5的文档中,明确标明了

Spring4支持的Hibernate3.6之后的版本,而且参考文档中也写的是Hibernate3的整合,所以在整合Hibernate4的时候就要注意了。

不过大致程还是一致的。

首先第一步在Spring容器中设置SessionFactory,下面是参考文档中给出的例子:

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>        <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>        <property name="username" value="sa"/>        <property name="password" value=""/>    </bean>    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">        <property name="dataSource" ref="myDataSource"/>        <property name="mappingResources">            <list>                <value>product.hbm.xml</value>            </list>        </property>        <property name="hibernateProperties">            <value>                hibernate.dialect=org.hibernate.dialect.HSQLDialect            </value>        </property>    </bean>
首先定义一个数据源,在这里采用的是DBCP(关于数据源的设置可以看前一节)。之后定义个SessionFactory的bean。注意这里

class,org.springframework.orm.hibernate3.LocalSessionFactoryBean,对应的是Hibernate3支持下的localsession,这种class仅

仅支持的是XML的Hibernate配置方式,不支持@Entity等Annotation。检查spring的orm jar包下的包,可以看到:



在Hibernate3中,为了能够使用Annotation的配置,在生成SessionFactory的bean时采用

org.springframework.orm.hibernate3.annotaion这个包下的 AnnotationSessionFactoryBean类,配置annotatedClasses属性即可以

置实体类。而在Hibernate4中,一个包就包含了xml和annotation,直接采用org.springframework.orm.hibernate4包下的

LocalSessionFactory类来配置即可。例如:

<bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="DataSource" ref="myDataSource" /><property name="annotatedClasses"><list><value>cn.wqy.model.User</value></list></property></bean>
这里通过property标签注入了DataSource和annotatedClasses。为什么Spring可以通过这种方式注入呢?学习了前面您的IoC就应该

可以推断出在org.springframework.orm.hibernate4.LocalSessionFactory类中含有DataSource和annotatedClasses两个属性和对应

的setter方法。验证确实含有。则在bean中配置了对应property之后就可以通过spring的IoC机制实现注入。

另,将数据源注入SessionFactory之后,为了配置hibernate的相关设置,需要加上“hibernateproperties”这个属性,在这个属性

下,可以配置之前在hibernate.cfg.xml配置的一些参数,例如:

<property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop></props></property>
注意在LocalSessionFactory类中hibernateProperties定义的是一个Properties类型的属性,所以需要按照属性的赋值方式。


之后,在Impl中注入我们的SessionFactory,配置如下:

package cn.wqy.DAO;import javax.annotation.Resource;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.stereotype.Repository;import cn.wqy.model.User;@Repository("userDAO")public class UserDAOImpl implements UserDAO {private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {return sessionFactory;}@Resourcepublic void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overridepublic void add(User user) {// TODO Auto-generated method stubSession session = sessionFactory.openSession();session.beginTransaction();session.save(user);session.getTransaction().commit();session.close();}}
通过setter方法实现注入。由于在Xml文件中添加了Annotation的支持,所以@Resource即可。

最后配置实体类的Annotation。像之前学习hibernate那样设置@Entity,@Id,@GeneratedValue等注解。同时在

sessionFactory的bean配置下配置annotatedClasses,相当于之前在hibernate的配置文件中设置mapping class。

有另一种偷懒的方法,就是在sessionFactory的bean配置下配置packagesToScan,该属性是一个string类型的数组。

<property name="packagesToScan"><list><value>cn.wqy.model</value></list></property>
配置了之后,Spring会自动扫描cn.wqy.model包下的所有类,将需要标为实体类的类自动mapping上。


至此,基本的Spring和Hibernate的整合完毕。



0 0
原创粉丝点击