spring和Hibernate集成


spring和Hibernate集成

spring能够简单的集成hibernate应用,spring的hibernate集成使用一般的事物框架和dao例外处理层次,这些都可以用在JDBC,JDO,IBATIS,和TOPLINK,可以使这些持续化方法的融合变得更加容易。
有两种spring的hibernate集成方法:
#使用HibernateTemplate和Callback反转控制。
#扩充HibernateDaoSupport和使用AOP拦截
IOC/HibernateTemplate方法和使用JdbcTemplate方法大致相同,这边我们使用HibernateDaoSupport/AOP方法。
在编写完标准的Hibernate映射文件之后,你需要做三件事:
1。配置Hibernate SessionFactory。
2。扩充DAO实施继承HibernateDaoSupport
3。使用AOP混合事物支持
这里是一个映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="model">
  <class name="Widget" table="WIDGETS">
    <id name="id" column="WIDGET_ID" type="long">
      <generator class="native"/>
    </id>
    <property name="name" column="NAME" type="string"/>
    <property name="size" column="SIZE" type="int"/>
  </class>
</hibernate-mapping>
这是一个非常普通的映射文件,Widget是一个普通的对象(没有集合,没有其他对象引用)现在我们配置SessionFactory:
这边是一个普通的spring SessionFactory配置,使用这个文件来替代以前的hibernate-config.xml文件。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="mappingResources">
      <list>
        <value>Widget.hbm.xml</value>
      </list>
    </property>
  </bean>
如果在类路径中有hibernate.properties文件,spring 的LocalSessionFactoryBean将使用这个文件配置数据库联接,dialect和连接池。你可以在spring中定义 DataSource并且显示的在LocalSessionFactoryBean中定义。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="mappingResources">
      <list>
        <value>Widget.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
      </props>
    </property>
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>
  </bean>
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
    <property name="url"><value>jdbc:hsqldb:mem:widgets</value></property>
    <property name="username"><value>sa</value></property>
    <property name="password"><value></value></property>
  </bean>
在实际的DAO实施中继承HibernateDaoSupport。
spring 的HibernateDaoSupport提供了所有方便的方法来和Hibernate交互,大部分都可以通过HibernateTemplate对象来访问。
请注意,Hibernate2使用检查例外HibernateException但是Hibernate3使用运行时例外。这里使用Hibernate3并且抛出运行时例外。但是比较适合的是在这里进行合适的例外处理。
 public class WidgetDAOHibernateImpl extends HibernateDaoSupport implements WidgetDAO {
  public Collection getWidgets() {
   return getHibernateTemplate().loadAll(Widget.class);
  }
  public Widget getWidgetById(Long id) {
   return (Widget)getHibernateTemplate().load(Widget.class,id);
  }
  public Widget saveWidget(Widget widget) {
   getHibernateTemplate.saveOrUpdate(widget);
   return widget;
  }
 }
如果需要使用事物管理,就需要将DAO和 HibernateINterceptor联合起来,这个拦截器绑定了一个新的Hibernate Session到当前线程,当方法返回时关闭和移出这个会话。如果已经有一个已绑定的会话,拦截器简单的让它加入。注意实际的“widgetDAO”定义为一个代理对象,这个对象指向实际的接口实施"widgetDaoTarget"。
<!-- THE HIBERNATE INTERCEPTOR -->
  <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>
  <bean id="widgetDaoTarget" class="WidgetDAOHibernateImpl">
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>
  <bean id="widgetDAO" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.zabada.springrecipes.base.WidgetDAO</value>
    </property>
    <property name="interceptorNames">
      <list>
        <value>hibernateInterceptor</value>
        <value>widgetDaoTarget</value>
      </list>
    </property>
  </bean>

  
  

你可能感兴趣的:(DAO,spring,AOP,Hibernate,HSQLDB)