JDOUsing Spring with JDO and Hibernate 3F3F3F_第1页
JDOUsing Spring with JDO and Hibernate 3F3F3F_第2页
JDOUsing Spring with JDO and Hibernate 3F3F3F_第3页
JDOUsing Spring with JDO and Hibernate 3F3F3F_第4页
JDOUsing Spring with JDO and Hibernate 3F3F3F_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

将将Spring与与JDO结合使用结合使用 JDO是用于Java应用程序持久性的非EJB标准。本部分将使用我们最喜欢的JDO实现Kodo实 现应用程序的透明持久性。在这部分内容中,我不会试图教授给您关于JDO的知识,而是为您示 范如何应用它使应用程序具有持久性。 假如您是JDO忠实的追随者,可能会记起种种像十字军东征般激烈的奋斗。大多数人一直在避免 使用JDO,这种情况直到最近才有所改善。由于即将发布JDO 2.0、若干可靠的商业JDO实现和开 源JDO实现, 该持久性标准似乎正在积聚其作为在ORM领域更强大参与者的动力。 事实上, Solar Metric的Kodo是我喜欢的ORM实现,可能也是领先的ORM实现。当谈到商业实现时Solar Metric 的Kodo似乎比其他可选产品更加健壮。 Solar Metric的Kodo具有更加灵活的映射支持,更加易于管理,具有更加丰富的核心企业持久性 支持。请考虑以下这些优势: ? 假如您在寻找开放的JDO实现或者对源代码更好的控制, 您能够从各种开放源码JDO实现中 做出选择。 ? 假如您不需要以上的JDO实现,可以选择商业实现,以公平的价格获得支持和维护。 ? 在顶尖商业厂商的帮助下,您可以获得难以置信的力量与表现,从更出色的管理到更灵活 的映射。 ? 在开放标准提供的保护与安全保障下获得全部这些优势。 如何实现?如何实现? 您将使用JDO创建一个持久性的模型,随后通过正面层(faade layer)使用该模型。该应用程序 已创建好了一个业务域模型。但它还不具备持久性。同时您还获得一个正面层的界面。只需按照 以下步骤操作就能启用JDO应用程序: 1 使域模型具备永久性。可通过字节码增强器实现。 2 在配置文件中进行一些简单的更改即可将Spring配置为使用Kodo。 3 通过JDO模板构建使用持久性模型的正面。 就是这样。Sping将管理核心JDO资源,JDO核心资源由PersistenceManagerFactory和 PersistenceManager构成。 将这些特殊选项看作JDO的数据源和连接。 您能通过Spring管理事务。 需要完成的一切工作就是上述三步。 首先,需要下载并安装Kodo。我们从试用版开始,可在找到试用版。 学习本书时可使用Kodo 3.2.1。您必须再一次将/kodo-jdo-3.2.1/lib中的库添加到/lib文件夹中。 通过修改Ant任务添加JDO字节码增强步骤使模型具有持久性: 为此添加一个Ant任务, 如示例5-8 所示。 示例示例5-8. build.xml 您还需为kodo-jdo.jar、jdo-1.0.1.jar和jakarta-commons-lang-1.0.1.jar向Ant构建文件添加路径元素。 下一步,构建持久性映射。最简单的方法是通过Kodo向导构建持久性映射。启动工作台(在您 安装的Kodo的bin目录中)然后从菜单中选择MetaDataCreate MetaData。反之,您也可以使用 /kodo-jdo-3.2.1/bin目录中的metadatatool和mappingtool脚本创建元数据,这两个工具分别是 kodo.jdbc.meta.MappingTool和kodo.meta.JDOMetaDataTool的启动器。 但为保持和其他JDO版本的一致,您将从头开始使用XML构建映射。通过类元数据生成一个.jdo文 件和一个.mapping文件。这两个文件驻留于/war/WEB-INF/classes/com/springbook文件夹。 示例5-9显示元数据文件。 示例5-9示例5-9package.jdo 示例5-10将对映射文件进行说明。 示例示例5-10.package.mapping 这似乎很简单。模型本身不具备持久性,这正是您要使用OR技术的原因。您还需要一个代码层, 以为您的应用程序使用持久性模型。这就是正面层。您将看到一系列对模板的调用。为查询器指 定JDO查询语言语句,为删除、更新和插入指定要保持的对象。您已经拥有一个界面,但我们还 需要实现正面(示例5-11)。 示例示例5-11. KodoRentABike.java public class KodoRentABike extends JdoDaoSupport implements RentABike private String storeName; public List getBikes( ) return (List)getJdoTemplate( ).find(Bike.class); public Bike getBike(String serialNo) Collection c = getJdoTemplate( ).find(Bike.class, serialNo = + serialNo + ); serialNo = + serialNo + ); Bike b = null; if(c.size( ) 0) b = (Bike)c.iterator().next( ); return b; public Bike getBike(int bikeId) return (Bike)getJdoTemplate( ). getObjectById(Bike.class, new Long(bikeId); public void saveBike(Bike bike) getJdoTemplate( ).makePersistent(bike); public void deleteBike(Bike bike) getJdoTemplate( ).deletePersistent(bike); /etc. 这并非完整的JDO查询语言查询; 它只是一个过滤器。 JDO 2.0将添加一个便利的查 询字符串,因此您可以单一字符串的形式添加一个完整的JDO查询,而无需构建一 个完整查询。 最后,还需要您进行一些配置,将其联系在一起。首先,示例5-12以给出JDO配置。 示例示例5-12.perties # To evaluate or purchase a license key, visit kodo.LicenseKey: YOUR_LICENSE_KEY_HERE javax.jdo.PersistenceManagerFactoryClass: kodo.jdbc.runtime. JDBCPersistenceManagerFactory javax.jdo.option.ConnectionDriverName: com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName: bikestore javax.jdo.option.ConnectionPassword: javax.jdo.option.ConnectionURL: jdbc:mysql:/localhost/bikestore javax.jdo.option.Optimistic: true javax.jdo.option.RetainValues: true javax.jdo.option.NontransactionalRead: true javax.jdo.option.RestoreValues: true kodo.Log: DefaultLevel=WARN, Runtime=INFO, Tool=INFO kodo.PersistenceManagerImpl: DetachOnClose=truekodo.PersistenceManagerImpl: DetachOnClose=true Spring上下文需要将JDO持久性管理器、持久性管理器工厂、正面和正面上的所有服务联系在一 起。这是在上下文中完成的(示例5-13)。 示例示例5-13。RentABikeApp-servlet.xml E:RentABikeAppwarWEB-INFperties Bruces Bikes 您已经完成了使用正面的测试实例,那么就可以构建正面让它正常运作了。 注意:detachOnClose确定JDO加载断开连接前不活跃的所有对象,所以应用程序的其 他部分 (如视图)将只能访问已加载的bean。 发生了什么?发生了什么? 这是Spring力量的完美示范。您已经从根本上改变了持久性层的实现,而完全没有影响应用程序 的其他部分。在此将介绍它的工作原理。 Spring首先使用依赖性注入(dependency injection)来分解所有依赖性。通过您提供的数据源加 载上下文配置JDO,然后在正面JDO实现中设置持久性管理器工厂。随后,当您地调用正面上的 方法时, Spring允许您使用持久性管理器并用它来处理您提供的查询。 您可以这样看待它: Spring 提供通用的JDO正面方法,调用模板。您插入详细信息,并将控制权交给Spring。 无论是骑自行车还是编写代码, 最重要的度量标准之一就是效率。 每一次踏板的转动或每行代码 的运行会产生多大的效果呢?请考虑JDO版本的应用程序。Spring编程模型的最引人注目的优点 就是效率。如果想明白我的话,请想想您在这里没有看到哪些东西。 ? 没有扰乱应用程序较低层的异常管理。通过Spring的未检查异常,您可以在适合处理异常的 时候捕获它。 ? 没有资源管理。JDBC有连接的地方,JDO就有持久性管理器。Spring配置持久性管理器工 厂并在模板内替您管理持久性管理器。 ? 您无需管理正面中的事务和安全。Spring使您能够轻松配置这一切,因此您能使正面层抛开 所有讨厌的细节并让它专注于持久性模型的使用。 在Spring模板中能完成所有这些配置,这些配置通过同Spring框架一起提供的代码完成。阅读这 些代码您能更好的理解它们或在必要时进行调试。 简而言之, 每一行代码都会发挥更大的作用 就像以较高的档位骑自行车一样。这才是所有最成功的框架和编程语言的关键之处。 将将Spring与与Hibernate结合使用结合使用 长久以来,Spring开发者选择Hibernate作为持久性框架。尽管Spring小组不断努力改善与其它持 久性框架的集成,Hibernate依然是与Spring结合使用得最广泛的持久性框架。这两种轻量级解决 方案相互促进成功的解决方案,结合起来很合理。它们能完美地配合。在本示例中,将讲解如何 集成Spring和Hibernate。 Hibernate是出色的持久性框架。它非常受欢迎,相对来说更快,并且是免费的。它具有丰富的映 射支持和便捷的使用模型, 这使它受到全世界开发者的拥戴。 Hibernate能够提供对小型或中型项 目的良好支持,尽管它并非标准,但可以说是除EJB之外最流行的持久性框架。 如何实现?如何实现? 既然您已经通过ORM完成Spring的配置,通过持久性域模型和正面,您了解了基本流程。因为 Spring发行时就具备与Hibernate的相关性,所以您只需将以下文件从/dist文件夹复制到/lib文件 夹:hibernate2.jar、aopalliance.jar、cglib-full-2.0.2.Jar、dom4j.jar、 ehcache-1.1.jar和odmg.jar。 因为Hibernate使用反射,所以没有字节代码增强步骤。为使模型具有持久性,您需要做的全部工 作就是创建映射并在上下文中引用这些映射。示例5-14、5-15和5-16将对映射进行说明。 示例示例 5-14. Bike.hbm.xml 示例示例5-15.Customer.hbm.xml 此映射的Hibernate版本与JDO对应部分相比略好一些。它具有更丰富的标识生成库。 示例示例5-16.Reservation.hbm.xml 在上下文中,您需要配置Hibernate属性和和会话工厂,并将会话工厂插入正面。事务策略为JDO 上下文、iBATIS上下文和Hibernate上下文相同,一切都妥妥当当。这就是依赖性注入代替您做 的工作。示例5-17显示了上下文的变更。 示例示例5-17. RentABikeApp-servlet.xml Bruces Bikes com/springbook/Bike.hbm.xml com/springbook/Bike.hbm.xml com/springbook/Customer.hbm.xml com/springbook/Reservation.hbm.xml com/springbook/Customer.hbm.xml com/springbook/Reservation.hbm.xml net.sf.hibernate.dialect.MySQLDialect true Hibernate用户通常将所有映射类都放到不同的文件中,与JDO不同。这并非强制性要 求,而只是Hibernate用户管理事务的典型习惯方式。 您已经得到了一个正面界面, 接下来只需完成Hibernate实现。 与在JDO中一样, 您可以使用模板。 为查找程序指定一个Hibernate查询语言(HQL)语句。而需要为更新做的一切就是指定要存储的 新存储对象。示例5-18给出了一个非常简洁的正面。 示例示例5-18.HibRentABike.java package com.springbook; import org.springframework.orm.hibernate.support.HibernateDaoSupport; import java.util.List; import java.util.Date; import java.util.Set; import net.sf.hibernate.Query; public class HibRentABike extends HibernateDaoSupport implements RentABike private String name; public List getBikes( ) return getHibernateTemplate( ).find(from Bike); public Bike getBike(String serialNo) Bike b = null; List bikes = getHibernateTemplate( ). find(from Bike where serialNo = ?, serialNo); if(bikes.size( ) 0) b = (Bike)bikes.get(0); return b; public Bike getBike(int bikeId) return (Bike)getHibernateTemplate( ). load(Bike.class, new Integer(bikeId); public void saveBike(Bike bike) getHibernateTemplate( ).saveOrUpdate(bike); public void deleteBike(Bike bike) getHibernateTemplate( ).delete(bike); public void setStoreName(String name) = name; public String getStoreName( ) return ; public List getCustomers( ) return getHibernateTemplate( ).find(from Customer); public Customer getCustomer(int custId) return (Customer)getHibernateTemplate( ). load(Customer.class, new Integer(custId); public List getReservations( ) return getHibernateTemplate( ).find(from Reservation); public List getReservations(Customer customer) return getHibernateTemplate( ). find(from Reservation where custId = ?, customer.getCustId( ); public List getReservations(Bike bike) return getHibernateTemplate( ). find(from Reservation where bikeId = ?, bike.getBikeId( ); public List getReservations(Date date) return getHibernateTemplate( ). find(from Reservation where resdate = ?, date); public Reservation getReservation(int resId) return (Reservation)getHibernateTemplate( ). load(Reservation.class, new Integer(resId); 发生了什么?发生了什么? Hibernate流和JDO流几乎相同。Spring JDO模板表示一组默认DAO方法。需要您做的只是对其进 行定制,通常使用HQL查询语句,可能还要使用HQL参数化查询的参数值。随后Spring获取控制 权、开始会话、触发查询并管理任何异常。 您将再一次看到异常的利用。示例5-19给出一个典型的Hibernate方法,编写该方法无需Spring。 示例示例 5-19.HibRentABike.java public List getBikesOldWay( ) throws Exception / Relies on other static code for configuration / and generation of SessionFactory. Might look like: / Configuration config = new Configuration( ); / config.addClass(Bike.class).addClass(Customer.class). / addClass(Reservation.class); / SessionFactory mySessionFactory = Configuration. / buildSessionFactory( ); List bikes = null; Session s = null; try s = mySessionFactory.openSession( ); bikes = s.find(from Bike); catch (Exception ex) /handle exception gracefully finally s.close( ); return bikes; 示例5-20再次展示Spring对应部分。 示例示例5-20. HibRentABike.java public List getBikes( ) return getHibernateTemplate( ).find(from Bike); 能力

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论