- 浏览: 21503073 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2418446
-
Spring杂谈
浏览量:3008660
-
跟开涛学SpringMVC...
浏览量:5639353
-
Servlet3.1规范翻...
浏览量:259899
-
springmvc杂谈
浏览量:1597268
-
hibernate杂谈
浏览量:250209
-
跟我学Shiro
浏览量:5858830
-
跟我学Nginx+Lua开...
浏览量:701943
-
亿级流量网站架构核心技术
浏览量:785142
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
8.2 集成Hibernate3
Hibernate是全自动的ORM框架,能自动为对象生成相应SQL并透明的持久化对象到数据库。
Spring2.5+版本支持Hibernate 3.1+版本,不支持低版本,Spring3.0.5版本提供对Hibernate 3.6.0 Final版本支持。
8.2.1 如何集成
Spring通过使用如下Bean进行集成Hibernate:
- LocalSessionFactoryBean :用于支持XML映射定义读取:
configLocation和configLocations:用于定义Hibernate配置文件位置,一般使用如classpath:hibernate.cfg.xml形式指定;
mappingLocations :用于指定Hibenate映射文件位置,如chapter8/hbm/user.hbm.xml;
hibernateProperties:用于定义Hibernate属性,即Hibernate配置文件中的属性;
dataSource:定义数据源;
hibernateProperties、dataSource用于消除Hibernate配置文件,因此如果使用configLocations指定配置文件,就不要设置这两个属性了,否则会产生重复配置。推荐使用dataSource来指定数据源,而使用hibernateProperties指定Hibernate属性。
- AnnotationSessionFactoryBean:用于支持注解风格映射定义读取,该类继承LocalSessionFactoryBean并额外提供自动查找注解风格配置模型的能力:
annotatedClasses:设置注解了模型类,通过注解指定映射元数据。
packagesToScan:通过扫描指定的包获取注解模型类,而不是手工指定,如“cn.javass.**.model”将扫描cn.javass包及子包下的model包下的所有注解模型类。
接下来学习一下Spring如何集成Hibernate吧:
1、准备jar包:
首先准备Spring对ORM框架支持的jar包:
org.springframework.orm-3.0.5.RELEASE.jar //提供对ORM框架集成
下载hibernate-distribution-3.6.0.Final包,获取如下Hibernate需要的jar包:
hibernate3.jar //核心包
lib\required\antlr-2.7.6.jar //HQL解析时使用的包
lib\required\javassist-3.9.0.GA.jar //字节码类库,类似于cglib
lib\required\commons-collections-3.1.jar //对集合类型支持包,前边测试时已经提供过了,无需再拷贝该包了
lib\required\dom4j-1.6.1.jar //xml解析包,用于解析配置使用
lib\required\jta-1.1.jar //JTA事务支持包
lib\jpa\hibernate-jpa-2.0-api-1.0.0.Final.jar //用于支持JPA
下载slf4j-1.6.1.zip(http://www.slf4j.org/download.html),slf4j是日志系统门面(Simple Logging Facade for Java),用于对各种日志框架提供给一致的日志访问接口,从而能随时替换日志框架(如log4j、java.util.logging):
slf4j-api-1.6.1.jar //核心API
slf4j-log4j12-1.6.1.jar //log4j实现
将这些jar包添加到类路径中。
2、对象模型定义,此处使用第七章中的UserModel:
java代码:
package cn.javass.spring.chapter7;
public class UserModel {
private int id;
private String myName;
//省略getter和setter
}
3、Hibernate映射定义(chapter8/hbm/user.hbm.xml),定义对象和数据库之间的映射:
java代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.javass.spring.chapter7.UserModel" table="test">
<id name="id" column="id"><generator class="native"/></id>
<property name="myName" column="name"/>
</class>
</hibernate-mapping>
4、 数据源定义,此处使用第7章的配置文件,即“chapter7/applicationContext-resources.xml”文件。
5、 SessionFactory配置定义(chapter8/applicationContext-hibernate.xml):
java代码:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 指定数据源 -->
<property name="mappingResources"> <!-- 指定映射定义 -->
<list>
<value>chapter8/hbm/user.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties"> <!--指定Hibernate属性 -->
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
</props>
</property>
</bean>
6、 获取SessionFactory:
java代码:
package cn.javass.spring.chapter8;
//省略import
public class HibernateTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-hibernate.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
sessionFactory = ctx.getBean("sessionFactory", SessionFactory.class);
}
}
此处我们使用了chapter7/applicationContext-resources.xml定义的“dataSource”数据源,通过ctx.getBean("sessionFactory", SessionFactory.class)获取SessionFactory。
7、通过SessionFactory获取Session对象进行创建和删除表:
java代码:
@Before
public void setUp() {
//id自增主键从0开始
final String createTableSql = "create memory table test" + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " + "name varchar(100))";
sessionFactory.openSession().
createSQLQuery(createTableSql).executeUpdate();
}
@After
public void tearDown() {
final String dropTableSql = "drop table test";
sessionFactory.openSession().
createSQLQuery(dropTableSql).executeUpdate();
}
使用SessionFactory创建Session,然后通过Session对象的createSQLQuery创建本地SQL执行创建和删除表。
8、使用SessionFactory获取Session对象进行持久化数据:
java代码:
@Test
public void testFirst() {
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = beginTransaction(session);
UserModel model = new UserModel();
model.setMyName("myName");
session.save(model);
} catch (RuntimeException e) {
rollbackTransaction(transaction);
throw e;
} finally {
commitTransaction(session);
}
}
java代码:
private Transaction beginTransaction(Session session) {
Transaction transaction = session.beginTransaction();
transaction.begin();
return transaction;
}
private void rollbackTransaction(Transaction transaction) {
if(transaction != null) {
transaction.rollback();
}
}
private void commitTransaction(Session session) {
session.close();
}
使用SessionFactory获取Session进行操作,必须自己控制事务,而且还要保证各个步骤不会出错,有没有更好的解决方案把我们从编程事务中解脱出来?Spring提供了HibernateTemplate模板类用来简化事务处理和常见操作。
8.2.2 使用HibernateTemplate
HibernateTimplate模板类用于简化事务管理及常见操作,类似于JdbcTemplate模板类,对于复杂操作通过提供HibernateCallback回调接口来允许更复杂的操作。
接下来示例一下HibernateTemplate的使用:
java代码:
@Test
public void testHibernateTemplate() {
HibernateTemplate hibernateTemplate =
new HibernateTemplate(sessionFactory);
final UserModel model = new UserModel();
model.setMyName("myName");
hibernateTemplate.save(model);
//通过回调允许更复杂操作
hibernateTemplate.execute(new HibernateCallback<Void>() {
@Override
public Void doInHibernate(Session session)
throws HibernateException, SQLException {
session.save(model);
return null;
}});
}
通过new HibernateTemplate(sessionFactory) 创建HibernateTemplate模板类对象,通过调用模板类的save方法持久化对象,并且自动享受到Spring管理事务的好处。
而且HibernateTemplate 提供使用HibernateCallback回调接口的方法execute用来支持复杂操作,当然也自动享受到Spring管理事务的好处。
8.2.3 集成Hibernate及最佳实践
类似于JdbcDaoSupport类,Spring对Hibernate也提供了HibernateDaoSupport类来支持一致的数据库访问。HibernateDaoSupport也是DaoSupport实现:
接下来示例一下Spring集成Hibernate的最佳实践:
1、 定义Dao接口,此处使用cn.javass.spring.chapter7.dao. IUserDao:
2、 定义Dao接口实现,此处是Hibernate实现:
java代码:
package cn.javass.spring.chapter8.dao.hibernate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.javass.spring.chapter7.UserModel;
import cn.javass.spring.chapter7.dao.IUserDao;
public class UserHibernateDaoImpl extends HibernateDaoSupport implements IUserDao {
private static final String COUNT_ALL_HQL = "select count(*) from UserModel";
@Override
public void save(UserModel model) {
getHibernateTemplate().save(model);
}
@Override
public int countAll() {
Number count = (Number) getHibernateTemplate().find(COUNT_ALL_HQL).get(0);
return count.intValue();
}
}
此处注意首先Hibernate实现放在dao.hibernate包里,其次实现类命名如UserHibernateDaoImpl,即×××HibernateDaoImpl,当然如果自己有更好的命名规范可以遵循自己的,此处只是提个建议。
3、进行资源配置,使用resources/chapter7/applicationContext-resources.xml:
4、dao定义配置,在chapter8/applicationContext-hibernate.xml中添加如下配置:
java代码:
<bean id="abstractDao" abstract="true">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="userDao" class="cn.javass.spring.chapter8.dao.hibernate.UserHibernateDaoImpl" parent="abstractDao"/>
首先定义抽象的abstractDao,其有一个sessionFactory属性,从而可以让继承的子类自动继承sessionFactory属性注入;然后定义userDao,且继承abstractDao,从而继承sessionFactory注入;我们在此给配置文件命名为applicationContext-hibernate.xml表示Hibernate实现。
5、 最后测试一下吧(cn.javass.spring.chapter8. HibernateTest):
java代码:
@Test
public void testBestPractice() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-hibernate.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
IUserDao userDao = ctx.getBean(IUserDao.class);
UserModel model = new UserModel();
model.setMyName("test");
userDao.save(model);
Assert.assertEquals(1, userDao.countAll());
}
和Spring JDBC框架的最佳实践完全一样,除了使用applicationContext-hibernate.xml代替了applicationContext-jdbc.xml,其他完全一样。也就是说,DAO层的实现替换可以透明化。
8.2.4 Spring+Hibernate的CRUD
Spring+Hibernate CRUD(增删改查)我们使用注解类来示例,让我们看具体示例吧:
1、首先定义带注解的模型对象UserModel2:
- 使用JPA注解@Table指定表名映射;
- 使用注解@Id指定主键映射;
- 使用注解@ Column指定数据库列映射;
java代码:
package cn.javass.spring.chapter8;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "test")
public class UserModel2 {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String myName;
//省略getter和setter
}
2、 定义配置文件(chapter8/applicationContext-hibernate2.xml):
2.1、 定义SessionFactory:
此处使用AnnotationSessionFactoryBean通过annotatedClasses属性指定注解模型来定义映射元数据;
java代码:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 1、指定数据源 -->
<property name="annotatedClasses"> <!-- 2、指定注解类 -->
<list><value>cn.javass.spring.chapter8.UserModel2</value></list>
</property>
<property name="hibernateProperties"><!-- 3、指定Hibernate属性 -->
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
</props>
</property>
</bean>
2.2、定义HibernateTemplate :
java代码:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
3、最后进行CURD测试吧:
java代码:
@Test
public void testCURD() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-hibernate2.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
HibernateTemplate hibernateTemplate = ctx.getBean(HibernateTemplate.class);
UserModel2 model = new UserModel2();
model.setMyName("test");
insert(hibernateTemplate, model);
select(hibernateTemplate, model);
update(hibernateTemplate, model);
delete(hibernateTemplate, model);
}
private void insert(HibernateTemplate hibernateTemplate, UserModel2 model) {
hibernateTemplate.save(model);
}
private void select(HibernateTemplate hibernateTemplate, UserModel2 model) {
UserModel2 model2 = hibernateTemplate.get(UserModel2.class, 0);
Assert.assertEquals(model2.getMyName(), model.getMyName());
List<UserModel2> list = hibernateTemplate.find("from UserModel2");
Assert.assertEquals(list.get(0).getMyName(), model.getMyName());
}
private void update(HibernateTemplate hibernateTemplate, UserModel2 model) {
model.setMyName("test2");
hibernateTemplate.update(model);
}
private void delete(HibernateTemplate hibernateTemplate, UserModel2 model) {
hibernateTemplate.delete(model);
}
Spring集成Hibernate进行增删改查是不是比Spring JDBC方式简单许多,而且支持注解方式配置映射元数据,从而减少映射定义配置文件数量。
私塾在线原创内容 转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2497.html】
8.2 集成Hibernate3
Hibernate是全自动的ORM框架,能自动为对象生成相应SQL并透明的持久化对象到数据库。
Spring2.5+版本支持Hibernate 3.1+版本,不支持低版本,Spring3.0.5版本提供对Hibernate 3.6.0 Final版本支持。
8.2.1 如何集成
Spring通过使用如下Bean进行集成Hibernate:
- LocalSessionFactoryBean :用于支持XML映射定义读取:
configLocation和configLocations:用于定义Hibernate配置文件位置,一般使用如classpath:hibernate.cfg.xml形式指定;
mappingLocations :用于指定Hibenate映射文件位置,如chapter8/hbm/user.hbm.xml;
hibernateProperties:用于定义Hibernate属性,即Hibernate配置文件中的属性;
dataSource:定义数据源;
hibernateProperties、dataSource用于消除Hibernate配置文件,因此如果使用configLocations指定配置文件,就不要设置这两个属性了,否则会产生重复配置。推荐使用dataSource来指定数据源,而使用hibernateProperties指定Hibernate属性。
- AnnotationSessionFactoryBean:用于支持注解风格映射定义读取,该类继承LocalSessionFactoryBean并额外提供自动查找注解风格配置模型的能力:
annotatedClasses:设置注解了模型类,通过注解指定映射元数据。
packagesToScan:通过扫描指定的包获取注解模型类,而不是手工指定,如“cn.javass.**.model”将扫描cn.javass包及子包下的model包下的所有注解模型类。
接下来学习一下Spring如何集成Hibernate吧:
1、准备jar包:
首先准备Spring对ORM框架支持的jar包:
org.springframework.orm-3.0.5.RELEASE.jar //提供对ORM框架集成 |
下载hibernate-distribution-3.6.0.Final包,获取如下Hibernate需要的jar包:
|
下载slf4j-1.6.1.zip(http://www.slf4j.org/download.html),slf4j是日志系统门面(Simple Logging Facade for Java),用于对各种日志框架提供给一致的日志访问接口,从而能随时替换日志框架(如log4j、java.util.logging):
slf4j-api-1.6.1.jar //核心API slf4j-log4j12-1.6.1.jar //log4j实现 |
将这些jar包添加到类路径中。
2、对象模型定义,此处使用第七章中的UserModel:
package cn.javass.spring.chapter7; public class UserModel { private int id; private String myName; //省略getter和setter }
3、Hibernate映射定义(chapter8/hbm/user.hbm.xml),定义对象和数据库之间的映射:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.javass.spring.chapter7.UserModel" table="test"> <id name="id" column="id"><generator class="native"/></id> <property name="myName" column="name"/> </class> </hibernate-mapping>
4、 数据源定义,此处使用第7章的配置文件,即“chapter7/applicationContext-resources.xml”文件。
5、 SessionFactory配置定义(chapter8/applicationContext-hibernate.xml):
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 指定数据源 --> <property name="mappingResources"> <!-- 指定映射定义 --> <list> <value>chapter8/hbm/user.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <!--指定Hibernate属性 --> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </prop> </props> </property> </bean>
6、 获取SessionFactory:
package cn.javass.spring.chapter8; //省略import public class HibernateTest { private static SessionFactory sessionFactory; @BeforeClass public static void beforeClass() { String[] configLocations = new String[] { "classpath:chapter7/applicationContext-resources.xml", "classpath:chapter8/applicationContext-hibernate.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); sessionFactory = ctx.getBean("sessionFactory", SessionFactory.class); } }
此处我们使用了chapter7/applicationContext-resources.xml定义的“dataSource”数据源,通过ctx.getBean("sessionFactory", SessionFactory.class)获取SessionFactory。
7、通过SessionFactory获取Session对象进行创建和删除表:
@Before public void setUp() { //id自增主键从0开始 final String createTableSql = "create memory table test" + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " + "name varchar(100))"; sessionFactory.openSession(). createSQLQuery(createTableSql).executeUpdate(); } @After public void tearDown() { final String dropTableSql = "drop table test"; sessionFactory.openSession(). createSQLQuery(dropTableSql).executeUpdate(); }
使用SessionFactory创建Session,然后通过Session对象的createSQLQuery创建本地SQL执行创建和删除表。
8、使用SessionFactory获取Session对象进行持久化数据:
@Test public void testFirst() { Session session = sessionFactory.openSession(); Transaction transaction = null; try { transaction = beginTransaction(session); UserModel model = new UserModel(); model.setMyName("myName"); session.save(model); } catch (RuntimeException e) { rollbackTransaction(transaction); throw e; } finally { commitTransaction(session); } }
private Transaction beginTransaction(Session session) { Transaction transaction = session.beginTransaction(); transaction.begin(); return transaction; } private void rollbackTransaction(Transaction transaction) { if(transaction != null) { transaction.rollback(); } } private void commitTransaction(Session session) { session.close(); }
使用SessionFactory获取Session进行操作,必须自己控制事务,而且还要保证各个步骤不会出错,有没有更好的解决方案把我们从编程事务中解脱出来?Spring提供了HibernateTemplate模板类用来简化事务处理和常见操作。
8.2.2 使用HibernateTemplate
HibernateTimplate模板类用于简化事务管理及常见操作,类似于JdbcTemplate模板类,对于复杂操作通过提供HibernateCallback回调接口来允许更复杂的操作。
接下来示例一下HibernateTemplate的使用:
@Test public void testHibernateTemplate() { HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory); final UserModel model = new UserModel(); model.setMyName("myName"); hibernateTemplate.save(model); //通过回调允许更复杂操作 hibernateTemplate.execute(new HibernateCallback<Void>() { @Override public Void doInHibernate(Session session) throws HibernateException, SQLException { session.save(model); return null; }}); }
通过new HibernateTemplate(sessionFactory) 创建HibernateTemplate模板类对象,通过调用模板类的save方法持久化对象,并且自动享受到Spring管理事务的好处。
而且HibernateTemplate 提供使用HibernateCallback回调接口的方法execute用来支持复杂操作,当然也自动享受到Spring管理事务的好处。
8.2.3 集成Hibernate及最佳实践
类似于JdbcDaoSupport类,Spring对Hibernate也提供了HibernateDaoSupport类来支持一致的数据库访问。HibernateDaoSupport也是DaoSupport实现:
接下来示例一下Spring集成Hibernate的最佳实践:
1、 定义Dao接口,此处使用cn.javass.spring.chapter7.dao. IUserDao:
2、 定义Dao接口实现,此处是Hibernate实现:
package cn.javass.spring.chapter8.dao.hibernate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import cn.javass.spring.chapter7.UserModel; import cn.javass.spring.chapter7.dao.IUserDao; public class UserHibernateDaoImpl extends HibernateDaoSupport implements IUserDao { private static final String COUNT_ALL_HQL = "select count(*) from UserModel"; @Override public void save(UserModel model) { getHibernateTemplate().save(model); } @Override public int countAll() { Number count = (Number) getHibernateTemplate().find(COUNT_ALL_HQL).get(0); return count.intValue(); } }
此处注意首先Hibernate实现放在dao.hibernate包里,其次实现类命名如UserHibernateDaoImpl,即×××HibernateDaoImpl,当然如果自己有更好的命名规范可以遵循自己的,此处只是提个建议。
3、进行资源配置,使用resources/chapter7/applicationContext-resources.xml:
4、dao定义配置,在chapter8/applicationContext-hibernate.xml中添加如下配置:
<bean id="abstractDao" abstract="true"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="userDao" class="cn.javass.spring.chapter8.dao.hibernate.UserHibernateDaoImpl" parent="abstractDao"/>
首先定义抽象的abstractDao,其有一个sessionFactory属性,从而可以让继承的子类自动继承sessionFactory属性注入;然后定义userDao,且继承abstractDao,从而继承sessionFactory注入;我们在此给配置文件命名为applicationContext-hibernate.xml表示Hibernate实现。
5、 最后测试一下吧(cn.javass.spring.chapter8. HibernateTest):
@Test public void testBestPractice() { String[] configLocations = new String[] { "classpath:chapter7/applicationContext-resources.xml", "classpath:chapter8/applicationContext-hibernate.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); IUserDao userDao = ctx.getBean(IUserDao.class); UserModel model = new UserModel(); model.setMyName("test"); userDao.save(model); Assert.assertEquals(1, userDao.countAll()); }
和Spring JDBC框架的最佳实践完全一样,除了使用applicationContext-hibernate.xml代替了applicationContext-jdbc.xml,其他完全一样。也就是说,DAO层的实现替换可以透明化。
8.2.4 Spring+Hibernate的CRUD
Spring+Hibernate CRUD(增删改查)我们使用注解类来示例,让我们看具体示例吧:
1、首先定义带注解的模型对象UserModel2:
- 使用JPA注解@Table指定表名映射;
- 使用注解@Id指定主键映射;
- 使用注解@ Column指定数据库列映射;
package cn.javass.spring.chapter8; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "test") public class UserModel2 { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "name") private String myName; //省略getter和setter }
2、 定义配置文件(chapter8/applicationContext-hibernate2.xml):
2.1、 定义SessionFactory:
此处使用AnnotationSessionFactoryBean通过annotatedClasses属性指定注解模型来定义映射元数据;
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 1、指定数据源 --> <property name="annotatedClasses"> <!-- 2、指定注解类 --> <list><value>cn.javass.spring.chapter8.UserModel2</value></list> </property> <property name="hibernateProperties"><!-- 3、指定Hibernate属性 --> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </prop> </props> </property> </bean>
2.2、定义HibernateTemplate :
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
3、最后进行CURD测试吧:
@Test public void testCURD() { String[] configLocations = new String[] { "classpath:chapter7/applicationContext-resources.xml", "classpath:chapter8/applicationContext-hibernate2.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); HibernateTemplate hibernateTemplate = ctx.getBean(HibernateTemplate.class); UserModel2 model = new UserModel2(); model.setMyName("test"); insert(hibernateTemplate, model); select(hibernateTemplate, model); update(hibernateTemplate, model); delete(hibernateTemplate, model); } private void insert(HibernateTemplate hibernateTemplate, UserModel2 model) { hibernateTemplate.save(model); } private void select(HibernateTemplate hibernateTemplate, UserModel2 model) { UserModel2 model2 = hibernateTemplate.get(UserModel2.class, 0); Assert.assertEquals(model2.getMyName(), model.getMyName()); List<UserModel2> list = hibernateTemplate.find("from UserModel2"); Assert.assertEquals(list.get(0).getMyName(), model.getMyName()); } private void update(HibernateTemplate hibernateTemplate, UserModel2 model) { model.setMyName("test2"); hibernateTemplate.update(model); } private void delete(HibernateTemplate hibernateTemplate, UserModel2 model) { hibernateTemplate.delete(model); }
Spring集成Hibernate进行增删改查是不是比Spring JDBC方式简单许多,而且支持注解方式配置映射元数据,从而减少映射定义配置文件数量。
私塾在线原创内容 转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2497.html】
评论
(1)
private Transaction beginTransaction(Session session) {
Transaction transaction = session.beginTransaction();
transaction.begin();
return transaction;
}
上面函数里的 transaction.begin() 似乎不需要了,因为 session.beginTransaction() 里已经将transaction 给begin了。session.beginTransaction() 的代码如下:
public Transaction beginTransaction() throws HibernateException {
errorIfClosed();
if ( rootSession != null ) {
log.warn( "Transaction started on non-root session" );
}
Transaction result = getTransaction();
result.begin(); //这一行语句已经将transaction 给begin了
return result;
}
(2)
private void commitTransaction(Session session) {
session.close();
}
上面的函数体似乎没有将transaction 给 commit 了。
应 将函数名改为closeSession 或 将函数体改为:
session.getTransaction().commit();
session.close();
(3)
public void testFirst() {
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = beginTransaction(session);
UserModel model = new UserModel();
model.setMyName("myName");
session.save(model);
} catch (RuntimeException e) {
rollbackTransaction(transaction);
throw e;
} finally {
commitTransaction(session);
}
}
按照 finally 的定义: RuntimeException发生后, 先是catch语句块被执行,接着finally 语句块也要被执行。这意味着 rollbackTransaction(transaction) 被执行后,commitTransaction(session)跟着被执行,似乎有问题。
建议把commitTransaction 和 closeSession 两个操作分开, 然后将commitTransaction 放在try语句块里,将 closeSession 放在 finally 语句块里。
受教了
请问你这个问题咋解决的
(1)
private Transaction beginTransaction(Session session) {
Transaction transaction = session.beginTransaction();
transaction.begin();
return transaction;
}
上面函数里的 transaction.begin() 似乎不需要了,因为 session.beginTransaction() 里已经将transaction 给begin了。session.beginTransaction() 的代码如下:
public Transaction beginTransaction() throws HibernateException {
errorIfClosed();
if ( rootSession != null ) {
log.warn( "Transaction started on non-root session" );
}
Transaction result = getTransaction();
result.begin(); //这一行语句已经将transaction 给begin了
return result;
}
(2)
private void commitTransaction(Session session) {
session.close();
}
上面的函数体似乎没有将transaction 给 commit 了。
应 将函数名改为closeSession 或 将函数体改为:
session.getTransaction().commit();
session.close();
(3)
public void testFirst() {
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = beginTransaction(session);
UserModel model = new UserModel();
model.setMyName("myName");
session.save(model);
} catch (RuntimeException e) {
rollbackTransaction(transaction);
throw e;
} finally {
commitTransaction(session);
}
}
按照 finally 的定义: RuntimeException发生后, 先是catch语句块被执行,接着finally 语句块也要被执行。这意味着 rollbackTransaction(transaction) 被执行后,commitTransaction(session)跟着被执行,似乎有问题。
建议把commitTransaction 和 closeSession 两个操作分开, 然后将commitTransaction 放在try语句块里,将 closeSession 放在 finally 语句块里。
我项目使用的是SSH,但是目前备份是使用JDBC来备份的呢,
session = HibernateSessionFactoryUtil.getSession();
tx = session.beginTransaction();
String sql = "backup database SportSys to disk = '"+backupPath+"'";
session.createQuery(sql);
我是这样来做的,但是 session.createQuery貌似使用的只是hql语句啊,这个怎么转换成sql语句呢?谢谢。
呵呵
哈哈 那就再发个
发表评论
-
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
在应用层通过spring解决数据库读写分离
2012-11-09 07:28 3如何配置mysql数据库的主从? 单机配置mys ... -
跟我学spring3系列 word原版 下载
2012-11-03 20:39 122185《跟我学spring3系列》自发布以来得到大家的认可,非 ... -
跟我学spring3 电子书下载(完)
2012-05-03 14:23 52713感谢iteye各位网友对我的支持,在此谢过了! ... -
跟我学spring3 目录贴及电子书下载
2012-04-10 19:00 390463扫一扫,关注我的公众号 购买地址 ... -
【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3
2012-03-30 07:11 2749713.3 集成测试 13.3.1 ... -
【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3
2012-03-28 07:46 2361113.1 概述 13.1.1 测 ... -
【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3
2012-03-27 15:13 2079312.5 综合示例 12.5.1 概述 在第十一 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:26 2990312.4 基于Java类定义Bean配置元数据 12 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:00 56712.4 基于Java类定义Bean配置元数据 12 ... -
spring培训PPT(欢迎下载)
2012-03-24 21:55 45java私塾的 spring培训的PPT 欢迎大家下载。 包括 ... -
java私塾的spring培训PPT(欢迎下载)
2012-03-22 12:41 2973java私塾的 spring培训的PPT 欢迎大家下载。 ... -
【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3
2012-03-22 08:00 2664712.3 注解实现Bean定 ... -
【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3
2012-03-19 08:00 3314712.2 注解实现Bean依赖注入 12.2.1 ... -
【第十二章】零配置 之 12.1 概述 ——跟我学spring3
2012-03-19 07:59 2028612.1 概述 12.1.1 什 ... -
【第十一章】 SSH集成开发积分商城 之 11.3 实现积分商城层 ——跟我学spring3
2012-03-16 08:09 1805511.3 实现积分商城层 11.3.1 概述 ... -
【第十一章】 SSH集成开发积分商城 之 11.2 实现通用层 ——跟我学spring3
2012-03-14 08:08 1911411.2 实现通用层 11.2 ... -
【第十一章】 SSH集成开发积分商城 之 11.1 概述 ——跟我学spring3
2012-03-13 16:37 1941411.1 概述 11.1.1 功能概述 ... -
【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我学spring3
2012-03-13 08:46 12588先进行通用配置, 【第十章】集成其它Web框架 之 1 ...
相关推荐
1. spring 1.1 【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3 . . ....1.36 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3 . . . . . . . . . . . . . . . . . . .352
在本节中,我们将深入探讨Spring 3如何支持ORM(对象关系映射)技术,特别是其与Hibernate 3的集成。ORM技术允许开发者将数据库操作抽象化,使得Java对象可以直接与数据库中的记录进行交互,从而减少对SQL的直接依赖...
标题“跟我学spring”和描述“spring 的使用,每个知识点和项目中的运用,20章的介绍。”暗示这是一份详细介绍Spring框架使用方法的教程或手册,覆盖了Spring的各个方面,并以实例为导向,深入探讨了每个知识点在...
《跟我学Spring3》这本书详细介绍了Spring框架在多个方面的应用,包括ORM支持、事务管理和Web框架集成等。以下是对这些章节内容的详细说明: 【第八章】 对ORM的支持: 1. **8.1 概述**:ORM(Object-Relational ...
《跟我学Spring3》这本书详细介绍了Spring框架与各种ORM(对象关系映射)框架的集成,以及Spring的事务管理和Web框架集成。以下是其中关键知识点的深入解析: **8. ORM支持** 1. **8.1 概述**:ORM允许开发者以面向...
《跟我学Spring3》这本书是针对Spring框架的深入学习指南,涵盖了多个关键章节,包括Spring对ORM(对象关系映射)的支持、事务管理和与其他Web框架的集成等内容。以下是各章节主要内容的详细阐述: 1. **第八章:对...
《跟我学Spring3》是一本全面介绍Spring框架的教程,主要涵盖了Spring对ORM支持、事务管理以及与其他Web框架的集成等内容。以下是对其中关键知识点的详细解析: 1. **Spring对ORM的支持**: - **8.1 概述**:这...
《跟我学Spring3》是一本全面介绍Spring框架的教程,主要涵盖了Spring对ORM支持、事务管理、Web框架集成以及SSH集成开发等多个方面。Spring作为Java领域最流行的应用框架之一,其强大的功能和灵活性使得它在企业级...
《跟我学Spring3》是一本详细讲解Spring 3.0框架的教程,涵盖了Spring对ORM支持、事务管理、Web框架集成以及SSH集成等多个方面。以下是其中一些核心知识点的详细解析: 1. **Spring对ORM的支持**: - **8.1 概述**...