ORM模块对Hibernate、JDO、TopLinkiBatis等ORM框架提供支持
ORM模块依赖于dom4j.jar、antlr.jar等包
在Spring里,Hibernate的资源要交给Spring管理,Hibernate以及其SessionFactory等知识Spring一个特殊的Bean,有Spring负责实例化与销毁。因此DAO层只需要继承HibernateDaoSupport,而不需要与Hibernate的API打交道,不需要开启、关闭Hibernate的Session、Transaction,Spring会自动维护这些对象
1
2
3
4
5
6
|
public interface ICatDao{
public void createCat(Cat cat);
public List<Cat> listCats();
public int getCatsCount();
public Cat findCatByName(String name);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class CatDaoImpl extends HibernateDaoSupportimplements ICatDao{
public void createCat(Cat cat){
this .getHibernateTemplate().persist(cat);
}
public List<Cat> listCats(){
return this . getHibernateTemplate().find( "select cfrom Cat c" );
}
public int getCatsCount(){
Number n = (Number) this .getSession( true ).createQuery( "selectcount(c) from Cat c" ).uniqueResult();
return n.intValue();
}
public Cat findCatByName(String name){
List<Cat> catList = this .getHibernateTemplate().find( "select c from Cat where c.name = ?" ,name);
if (catList.size()> 0 )
return catList.get( 0 );
return null ;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
< bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" destroy-method = "destroy" >
< property name = "dataSource" ref = "dataSource" />
<!-- 该Package下的所有类都会被当做实体类加载-->
< property name = "annotatedPackages" value = "classpath:/com/clf/orm" />
< property name = "anotatedClasses" >
< list >
< value >com.clf.spring.orm.Cat</ value >
< value >com.clf.spring.orm.Dog</ value >
</ list >
< property name = "hibernateProperties" >
< props >
< prop key = "hiberante.dialect" >org.hibernate.dialect.MySQLDialect</ prop >
< prop key = "hibernate.show_sql" >true</ prop >
< prop key = " hibernate.format_sql" >true</ prop >
< prop key = " hibernate.hbm2ddl.auto" >create</ prop >
</ props >
</ property >
< bean id = "catDao" class = "com.clf.spring.orm.CatDaoImpl" >
< property name = "sessionFactory" ref = " sessionFactory" />
</ bean >
|
如果使用XML配置的实体类,则改为
1
2
3
4
5
6
7
8
|
< bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method = "destroy" >
< property name = "mappingResources" >
< list >
< value >classpath:/com/clf/orm/Cat.hbm.xml</ value >
</ list >
</ property >
……
</ bean >
|
Spring默认在DAO层添加事务,DAO层的每个方法为一个事务。Spring+Hibernate编程中,习惯的做法实在DAO层上再添加一个Service层,然后把事务配置在Service层
1
2
3
4
5
|
public interface ICatService{
public void createCat(Cat cat);
public List<Cat> listCats();
public int getCatsCount();
}
|
分层的做法是,程序调用Service层,Service层调用DAO层,DAO层调用Hibernate实现数据访问,原则上不允许跨曾访问。分层使业务层次更加清晰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class CatServiceImpl implements ICatService{
private IDao catDao;
public IDao getCatDao(){
return catDao;
}
public void setCatDao(IDao dao){
this .catDao = dao;
}
public void createCat(Cat cat){
catDao.createCat(cat);
}
public List<Cat> listCats(){
return catDao.listCats();
}
public int getCatsCount(){
return catDao.getCatsCount();
}
}
|
然后再Service层配置事务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<!-- 事务管理器-->
< bean id = "hibernateTransactionManager" class=" org.springframework.orm.hibernate3.HibernateTransactionManager
">
< property name = "sessionFactory" ref = "sessionFactory" />
</ bean >
<!-- 事务管理规则-->
< bean id = "hibernateTransactionAttributeSource" class = " org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource" >
< property name = "properties" >
< props > <!-- 为所有方法加上事务-->
< propkeypropkey = "*" >PROPGATION_REQUIRED</ prop >
</ property >
</ bean >
<!-- 事务工厂代理类,将Service实现类、事务管理器、事务管理规则组装在一起-->
< bean id = "catService" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
< property name = "transactionManager" ref = " hibernateTransactionManager" >
< property name = "target" >
< bean class = "com.clf.spring.orm.CatServiceImpl" >
< property name = "catDao" ref = "catDao" />
</ bean >
</ property >
< property name = "transactionAttributeSource" ref = " hibernateTransactionAttributeSource" />
</ bean >
|
总结
以上就是本文关于Spring之ORM模块代码详解的全部内容,希望大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/u012152619/article/details/44216695