Spring2.0与Hibernate3整合
蔡超
北京天融信,软件架构师
SUN certified Enterprise Architect
Microsoft certified Solution Developer
IBM certified RUP Specialist
联系方式 :[email protected],[email protected]
010-82776427
Sping2 及 Hibernate3 都是如今流行的请量级框架,如何将两者进行整合呢,目前很多资料讨论的都是老版本的整合方式,下面给出这两种框架的新版整合方式。
1 配置数据源
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=webguide</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>talent</value>
</property>
</bean>
2 配置 Hibernate SessionFactory
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<!—Hibernate 映射文件列表 -->
<list>
<value>Greeting.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hbm2ddl.auto">update</prop>
</props>
</property>
<property name="dataSource">
<ref bean="myDataSource"/>
</property>
</bean>
3 配置事务
<bean id="myTranAttri" class="org.springframework.transaction.interceptor.DefaultTransactionAttribute">
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRED</value>
</property>
</bean>
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute">
<ref bean="myTranAttri"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor" lazy-init="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
4 使用 Hibernate 实体
方法一:采用 AOP 的方式 package hibernate.integration.entity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
/**
* @author chao cai
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class GreetingLogic3 implements IGreetingLogic{
private SessionFactory sessionFactory;
/* (non-Javadoc)
* @see hibernate.integration.entity.IGreetingLogic#loadGreeting(java.lang.Integer)
*/
public Greeting loadGreeting(Integer id) {
Session session = sessionFactory.getCurrentSession();
Greeting greeting=(Greeting) session.get(Greeting.class,id);
return greeting;
}
/**
* @return Returns the sessionFactory.
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* @param sessionFactory The sessionFactory to set.
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
代码样例:
package hibernate.integration.entity;
/**
* @author chao cai
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public interface IGreetingLogic {
public Greeting loadGreeting(Integer id);
}
配置
<bean id="myGreetingLogic" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>hibernate.integration.entity.IGreetingLogic</value>
</property>
<property name="interceptorNames">
<list>
<value>txInterceptor</value>
<value>myHibernateInterceptor</value>
</list>
</property>
<property name="target">
<ref bean="greetingLogic3"/>
</property>
</bean>
客户端代码:
AbstractApplicationContext context=new FileSystemXmlApplicationContext("spring-hibernate.xml");
IGreetingLogic gl=(IGreetingLogic) context.getBean("myProductDao");
greeting=gl.loadGreeting(new Integer(1));
System.out.println(greeting.getGreeting());
方法二:采用 HibernateDaoSupport
代码:
package hibernate.integration.entity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author Chao Cai
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class GreetingLogic extends HibernateDaoSupport implements IGreetingLogic{
public Greeting loadGreeting(Integer id){
Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
Greeting greeting=(Greeting) session.get(Greeting.class,id);
return greeting;
}
}
<bean id="greetingLogic" class="hibernate.integration.entity.GreetingLogic">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>