




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SessionFactory 注入 Spring 可以与Hibernate结合使用,Hibernate的连结、事务管理等是由建立SessionFactory开始的, SessionFactory在 应用程式中通常只需存在一个实例,因而SessionFactory底层的DataSource可以 使用Spring的 IoC注入,之后您再注入SessionFactory至相依的物件之中。 例如可以改写一下 第一个 Hibernate 程式,首先您可以删除hibernate.cfg.xml,因为这部份可以 由Spring在Bean定义档中撰写DataSource设定及依赖注入来取代,您可以如下撰写Spring的Bean 定义档: beansconfig.xmlcom.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/democaterpillar123456onlyfun/caterpillar/User.hbm.xmlorg.hibernate.dialect.MySQLDialect 可以看到 使用 Spring 整合 Hibernate 的好处,可 以直接将 DataSource 注入至 org.springframework.orm.hibernate3.LocalSessionFactoryBean 中,至于 Hibernate 所 需的相关设定, 则可透过 LocalSessionFactoryBean 的相关属性来设定,像是设定资料库名称、使用者名称、密码 等, LocalSessionFactoryBean 会建立 SessionFactory 的实例,并在执行依赖注入时将这个实例设 定给 UserDAO。 Hibernate 的物件与关联表格的映射文件之位置与名称,则指定于mappingResources属性中,如 果您自行提供 Hibernate 本 身的设定档(hibernate.cfg.xml),您也可以使用 configLocation属性 来指定设定档的位置,而这边则使用hibernateProperties属性在 Spring 的 Bean 定义档中直接指 定,可以藉此减少对 XML 组态档案的管理。 注意!在 Spring 1.2.6 中可以选择要整合 Hibernate 2 或 Hibernate 3(Hibernate 3 在套件名称上与 Hibernate 2 是 不相容的 ),因而在 Spring 中 整合时会 有两种版 本的 API ,例 如 org.springframework.orm.hibernate.LocalSessionFactoryBean 是在整合 Hibernate 2 时所使用的类别, 而 org.springframework.orm.hibernate3.LocalSessionFactoryBean 则是在整 合 Hibernate 3 时使用的 类别,因为主要类别名称是相同的(例如 LocalSessionFactoryBean),所以撰写时要注意套件名称 的设定是否正确。 专案中剩下的部份都不用修改,可以撰写一个简单的测试程式来看看如何使用 Spring 整合 Hibernate,进行简单的资料存取: SpringHibernateDemo.java package onlyfun.caterpillar;import org.springframework.context.ApplicationContext;import org.springframework.context. support.FileSystemXmlApplicationContext;public class SpringHibernateDemo public static void main(String args) ApplicationContext context =new FileSystemXmlApplicationContext( beans-config.xml);/ 建立 DAO 物件 IUserDAO userDAO =(IUserDAO) context.getBean(userDAO);User user = new User();user.setName(caterpillar);user.setAge(new Integer(30);userDAO.insert(user);user = userDAO.find(new Integer(1);System.out.println(name: + user.getName();执行的结果基本上与 HibernateDemo 专案是相同的。如果您不是选择加入 spring.jar 的话,则您 必须个别加入以下的档案至 Classpath 路径之中:spingcore.jar、springbeans.jar、springcontext.jar、 spring jdbc.jar、springdao.jar、springhibernate.jar。在映射文件的指定上,除了使用 mappingResources 属性设 定之外,您也可以使 用 mappingDirectoryLocations属性设定,一次指定某个路径下的所有.hbm.xml 档案,例如:.classpath:/onlyfun/caterpillar.HibernateTemplate Spring 在 Hibernate 上 实 现 的 Templatecallback 机 制 上 提 供 有 org.springframework.orm.hibernate3.HibernateTemplate 类 别 与 org.springframework.orm.hibernate3.HibernateCallback 介面,一个使用的例子如下:HibernateTemplate hibernateTemplate =new HibernateTemplate(sessionFactory);.hibernateTemplate.execute(new HibernateCallback() public Object doInHibernate(Session session) throws HibernateException return session.load(User.class););在HibernateTemplate上也提供有数个方便的方法,在呼叫时为您自动建立HibernateCallback物件, 例如get() 、save 、delete() 等方法,您可以改写 SessionFactory 注入 的UserDAO 类别,使用 HibernateTemplate来简化程式的撰写: UserDAO.javapackage onlyfun.caterpillar;import org.hibernate.SessionFactory;import org.springframework.orm. hibernate3.HibernateTemplate;public class UserDAO implements IUserDAO private HibernateTemplate hibernateTemplate;public void setSessionFactory(SessionFactory sessionFactory) hibernateTemplate =new HibernateTemplate(sessionFactory);public void insert(User user) hibernateTemplate.save(user);public User find(Integer id) User user =(User) hibernateTemplate.get(User.class, id);return user;其它的档案并不需要修改,执行的结果也是相同的,您必须在 Classpath 中加入 springorm.jar档 案才可以执行。 您可 以继承 org.springframework.orm.hibernate3.support.HibernateDaoSupport 类别来撰 写 UserDAO 类别,这可以帮您省去一些管理 SessionFactory、HibernateTemplate 资源的工作,您只 要注入 SessionFactory 的实例就可以了,例如将上面的 UserDAO 替代为以下的内容,则程式也是 可以执行:package onlyfun.caterpillar;import org.springframework.orm.hibernate3. support.HibernateDaoSupport;public class UserDAO extends HibernateDaoSupport implements IUserDAO public void insert(User user) getHibernateTemplate().save(user);public User find(Integer id) User user =(User) getHibernateTemplate().get(User.class, id);return user;Hibernate 编程事务管理 Hibernate提供有自己的事务管理实现,然而在使用Spring整合Hibernate时,建议将事务管理交由 Spring来负责,您可以使用编程式的事务管理,方法与第 5 章中直接使用JDBC进行编程式的事务 管理类似,例如可将 HibernateTemplate 中的UserDAO类别加以改写,使之具有事务管理功能。 UserDAO.javapackage onlyfun.caterpillar;import org.hibernate.SessionFactory;import org.springframework.dao.DataAccessException;import org.springframework.orm. hibernate3.HibernateTemplate;import org.springframework. transaction.TransactionDefinition;import org.springframework. transaction.TransactionStatus;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.transaction. support.TransactionTemplate;import org.springframework.orm. hibernate3.HibernateTransactionManager;public class UserDAO implements IUserDAO private TransactionTemplate transactionTemplate;private HibernateTemplate hibernateTemplate;public void setSessionFactory( SessionFactory sessionFactory) this.transactionTemplate =new TransactionTemplate(new HibernateTransactionManager(sessionFactory);this.hibernateTemplate =new HibernateTemplate(sessionFactory);public void insert(User user) final User userData = user;/ 设定传播行为transactionTemplate.setPropagationBehavior( TransactionDefinition.PROPAGATION_REQUIRED);transactionTemplate.execute(new TransactionCallbackWithoutResult() protected void doInTransactionWithoutResult( TransactionStatus status) try hibernateTemplate.save(userData);catch(DataAccessException e) e.printStackTrace(); status.setRollbackOnly(););public User find(Integer id) User user =(User) hibernateTemplate.get(User.class, id);return user;org.springframework.transaction.support.TransactionTemplate 类别在建立时,需 要一个实作 PlatformTransactionManager 的 实 例 , 这 边 使 用 的 是 org.springframework.orm.hibernate3.HibernateTransactionManager 类 别 来 建 立 实 例 , TransactionTemplate 必须设定传播行为(Propagation Behavior)、并使用 Callback 物件来执行事务, 在发生例外时,使用 TransactionStatus 撤消操作,您可以参考一下 Spring 参考手册来了解一些细 节说明。 Hibernate 宣告式事务管理 Spring对Hibernate提供宣告式的事务管理,这与 JDBC 宣告式事务管理 类似,先来介绍一下比 较简单的方式,直接从HibernateTemplateDemo专案来进行改写,事实上您不需要修改UserDAO 类别,而只要在定义档上设定即可: UserDAO.javacom.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/democaterpillar123456onlyfun/caterpillar/User.hbm.xmlorg.hibernate.dialect.MySQLDialectonlyfun.caterpillar.IUserDAOPROPAGATION_REQUIRED主要的差别在于设定档中建立了transactionManager与userDAOProxy,由于Spring所提供的一致性 的设定模型,所以设定的方式与 JDBC 宣告式事务管理 的设定方式是类似的。 来写个程式测试一下,这次取回DAO代理物件来进行操作,如下所示: SpringHibernateDemo.java package onlyfun.caterpillar;impor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美容外科技术试题及答案
- 辅警接处警培训课件
- 辅警医护岗知识培训内容课件
- 建设银行2025鹤壁市秋招群面案例总结模板
- 建设银行2025厦门市秋招笔试性格测试题专练及答案
- 农业银行2025曲靖市笔试英文行测高频题含答案
- 农业银行2025晋中市秋招半结构化面试题库及参考答案
- 2025行业技术革新趋势预测
- 农业银行2025周口市秋招半结构化面试题库及参考答案
- 农业银行2025朝阳市笔试英文行测高频题含答案
- 中小学高级职称英语全英答辩题
- 新版教科版科学五年级上册全册课件
- 小学地方课程教案(全面完整版)
- 山西省家庭经济困难学生认定申请表
- 国家职业技能标准——城市轨道交通列车司机(2020版)
- 《社会学概论》全套课件-PPT
- 动力弹塑性分析滞回模型-迈达斯
- 驾驶员实用英语口语
- 小学六年级上册音乐-第1课《我的祖国》--湘教版(12张)ppt课件
- 脐疗-望脐知健康ppt课件
- 完整版陆河客家请神书
评论
0/150
提交评论