在Spring中使用JDO

在Spring中使用JDO,第1张

前言

在此前的Spring A Developer s Notebook摘录中 作者Bruce Tate和Justin Gehtland讨论了在Spring中使用iBATIS OR持久化框架的内容 出于其他的原因 此选择要求深入SQL底层 在这篇第五章的摘录中 他们转向那些更加彻底地把SQL从你的Spring应用中独立的持久化框架

JDO是基于接口标准的持久化 或如Tate 和Gehtland所言 在Java应用中非EJB标准的持久化 一经提及JDO 他们不是卷入那场 众说纷纭 的辩论之中 而是着眼于如何把一顶级的实现 Kodo 引入到你的Spring应用中 接着转去讨论最流行的 且可能是与Spring集成最好的OR框架 Hibernate 正如他们所指出的 尽管是非标准的 但你可以说在EJB之后 Hibernate是世界上最流行的持久化框架了 本章中 作者们不仅为你演示设置每个框架的具体细节 而且还清晰地表明了各种框架的使用方法之差异

就象Developer s Notebook 系列中所有的书一样 你将由直接的且实用的方式获得信息 这些信息包含了完成你工作所需的细节 换言之 一切来自实战 没有讲义

在Spring中使用JDO

JDO是Java 应用中非EJB标准的一种持久化方式 在这部分中 我们将使用我们喜欢的JDO实现 Kodo 来实现我们应用中的透明持久化 虽然我们不会试着教给你JDO的知识 但会说明怎样使用JDO来为我们的应用提供持久化的功能

无论你从事JDO多长时间 可能都会使你想起众说纷纭的辩论 直到最近 大多数人都避免使用JDO 随着JDO 版本和许多可靠的商业化及开源的JDO实现的暂停发布 这个持久化标准看起来就象是一个强壮的运动员在ORM舞台上蓄势待发(译注 在翻译本文激基时获悉 JDO 已投票通过) 实际上 我所钟爱的ORM是Solar Metric的Kodo 它或许称得上JDO实现中的矫矫者了 当Kodo达到商业化实现时 它看起来比其它可供选择的实现更加强壮 且已获得更灵活的映射支持 更易于管理 来自持久化企业核心越来越丰富的支持 考虑以下这些优势 ?        若你正寻找某些免费的或能对源代码更好地控制的JDO实现 你可在众多的开源的轮铅数JDO实现中选择 ?        你可选择一价格合理的商业化产品 而且能得到支持和维护 ?        若选择了那些一流的商业化厂商 从较佳管理到灵活映射 你都可能得到难以置信的功能和性能 ?        在获得所有的这些优势的同时 你还能获得开源标准提供的保护和安全

我该怎么办?

你将使用JDO来创建一个持久化模型 随后在fa?ade层中使用那个模型 尽管应用程序中已创建了业务域模型 但仍未被持久化 你业已获得fa?ade层的接口 那么只需完成下述的 *** 作步骤 便可在你的应用中使用JDO了 通过字节码增强器(byte code enhancer)让域模型持久化

简单修改Spring的配置文件 你就可在你的应用中使用Kodo 通过JDO模板 建构使用持久化模型的fa?ade

就这些了 Spring会管理由PersistenceManagerFactory和PersistenceManager组成的JDO之核心资源 把这些特殊的选项当作是JDO的数据源与连接 你还可以让Spring来管理事务 上述三个步骤就是你所要完成的工作腊首

首先 你需要下载和安装Kodo 从试用的版本开始 你可在这里找到本书中使用 版本 再次提醒 你得把/kodo jdo /lib中的包放入我们的/lib目录下

为持久化模型 你得修改Ant任务以添加JDO字节码增强的步骤 象示例 所示的那样 添加Ant任务来完成这一动作

示例

你也需要在Ant 建构文件中给kodo jdo jar jdo jar and Jakarta mons lang jar增加路径元素

下一步 建构持久化映射 最简便的办法就是通过Kodo向导 运行Workbench(在你所安装的Kodo的\bin目录下) 并从菜单中选择MetaDataàCreate MetaDate 反之 你可使用/kodo jdo /bin目录下的metadatatool 和mappingtool两个脚本 它们分别被ta MappingTo ol和ta JDOMetaDataTool的运行文件所使用

为了与其它JDO版本保持一致 因此你打算用XML从头建构映射文件 用类的元数据和 mapping 文件生成 jdo文件 此两文件都在/war/WEB INF/classes//springbook目录下

示例 声明元数据文件

示例   package jdo

示例 描述了映射文件

示例 package mapping

几乎太容易了 模型本身没有被持久化 那就是我们使用OR技术的原因 尽管你仍需在你的应用程序中有一层代码 也就是我们所说的fa?ade层 来调用那个持久化模型 因此你将看到一系列的模板调用 查询器(finder)声明了JDO查询语句 及持久化删除 更新 新增的对象 你已经有了一个接口 但还需要实现fa?ade(如示例 )

示例 KodoRentABike java

这不是完全的JDO查询语言的查询 它只不过是个过滤器而已 JDO 将会增加一个便利的查询字符串 因而你可以以单一的字符串来添加完全的JDO查询 而毋须建构完全的查询

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 + ) Bike b = null if(c size( ) >) {b = (Bike)erator() 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的配置

示例 package properties

# To evaluate or purchase a license key visit YOUR_LICENSE_KEY_HEREjavax jdo PersistenceManagerFactoryClass kodo jdbc runtime JDBCPersistenceManagerFactoryjavax jdo option ConnectionDriverName mysql jdbc Driverjavax jdo option ConnectionUserName bikestorejavax jdo option ConnectionPassword javax jdo option ConnectionURL jdbc mysql://localhost/bikestorejavax jdo option Optimistic truejavax jdo option RetainValues truejavax jdo option NontransactionalRead truejavax jdo option RestoreValues truekodo Log DefaultLevel=WARN Runtime=INFO Tool=INFOkodo PersistenceManagerImpl DetachOnClose=true注意DetachOnClose 选项 它确保了JDO在关闭连接时的延迟加载 因而你应用程序的其它部分 象视图(view) 只能访问已加载的Bean Spring上下文需把JDO持久化管理器 持久化管理工厂 fa?ade 以及任何在fa?ade上的服务组合在一起 这些都在context中完成(示例 ) Example RentABikeApp servlet xml E \RentABikeApp\war\WEB INF\kodo propertiesBruce s Bikes

记得你已经有了一个使用fa?ade的测试用例 因此你可以建构并让它运行起来

发生了什么事?

这是个展示Spring功能的非常好的例子 尽管你已从根本上颠覆了持久化层的实现 但这并没有影响到应用程序的其它部分 以下就是它怎样工作的说明

Spring首先使用依赖注入来解决所有的依赖 加载的上下文配置了含有你所提供数据源的JDO 随之在fa?ade的JDO实现中设定持久化管理器工厂 接着 当你在fa?ade上调用方法时 Spring给了你持久化管理器并使用它来处理你所提供的查询 你可以这样来看 Spring提供一普通的(generic)JDO fa?ade方法 称之为模板 你插入(plug in)细节 并把控制权交给Spring

当你在骑自行车或编写代码时 一个最重要的衡量标准是效率 每当脚踏板转一圈 或每写一行代码 你可完成多少的工作?想想JDO版本的应用程序 Spring编程模型最迫切的事是效率 为了看明白我说的意思 想一下你没见到的 ?        没有异常管理 而?        往往就是这些异常管理混乱了你应用程序的较底层 利用Spring未捕捉异常(Unchecked Exception)的机制 ?        你可以在得到异常的地方适当地做些事情 ?        没有资源管理 只要有JDBC连接的地方 ?        就有JDO持久化的管理器 Spring配置了持久化管理器工厂 ?        并且在模板内为你管理持久化管理器 ?        你没有被强制管理事务及facade的安全 Spring让你很容易地来配置这些东西 ?        因此你可以从你的fa?ade层中将丑陋的细节束之高阁 ?        让它专注于使用持久化模型

在Spring的模板中这些都为你完成了 这些模板放在与Spring框架一起的代码中 这些让你读起来更加容易理解 或在必要时debug之 简而言之 你可以在每一行的代码中得到平衡 更象你在高速地踏自行车 那就是所有最成功的框架和程序设计语言的底线

在Spring中使用Hibernate

Spring开发人员选择Hibernate作为持久化框架已经有很长的一段时间了 尽管Spring团队在持续致力于改善与其它持久化框架的集成 但在所有与Spring集成的持久化框架中 Hibermate保持了最为广泛使用的地位 确切地说 这两个轻量级的解决方案在相互促进中获得成功 他们一起茁壮成长 在这此例中 我们将表明如何将Spring与Hibernate集成起来一同工作

Hibernate是个优秀的持久化框架 她深受欢迎 运行速度相当快 并且是免费的 除此之外 它还拥有丰富的映射支持 且是一个便利的使用模型 使得它在全球的开发者中流行起来 Hibernate已经在小型和中型的项目中经受住了非常好的考验 实际上 尽管它还未被确认为标准 但可以说在EJB之后 Hibernate是世界上最流行的持久化框架

我该怎么办?

既然你已用持久化域模型和fa?ade 的ORM配置了Spring 你就了解了基本的流程 由于Spring 被设计成与Hibernate 独立 你只需从Spring的/dist 目录中复制hibernate jar aopalliance jar cglig full jar dom j jar ehcache jar 及admg jar到你项目的/lib目录下

由于Hibernate使用了反射机制 因此就没有字节加强步骤 所有你已尝试过让模型持久化的做法 就是来创建映射 并且在上下文中引用他们 示例 及 表明了创建映射的过程

Example Bike hbm xml

unsaved value= >

Hibernate版的这个映射较之JDO版的相应代码更为雅致 它有着更加丰富的识别码(Identification)生成库

Example Customer hbm xml

unsaved value= >Example Reservation hbm xml unsaved value= >cascade= none />cascade= none />

在上下文中 你需要配置Hibernate属性 配置session factory 并把session factory插入到fa?ade中 使用JDO 上下文 iBATIS上下文及Hibernate上下文的事务策略都是一样的 就想他们本该那样似的 那就是依赖注入正为你所做的一部分 示例 表明了对上下文的变动

Example RentABikeApp servlet xml

Bruce s Bikesclass= springframework orm hibernate LocalSessionFactoryBean >/springbook/Bike hbm xml/springbook/Customer hbm xml/springbook/Reservation hbm xmlnet sf hibernate dialect MySQLDialecttrue

不象JDO那样 Hibernate用户经常把所有的映射类放入独立定的多个文件中 这不是必需的 仅是Hibernate用户特别喜欢管理事前的一种方式而已

既然已有了一个fa?ade接口 你只需一个Hibernate实现即可 你可以使用模板 就象JDO那样 至于查询器(Finder) 你所要做的就是指定一个Hibernate 查询语言(HQL)语句 至于更新(update)部分 你所要做的就是指明将被存储的新对象 示例 就是个非常薄的fa?ade的例子

Example HibRentABike java

package springbook import 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( ) >) {b = (Bike)bikes get( ) }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) {this name = name }public String getStoreName( ) {return this name }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)) }}发生了什么事?Hiberante的做法与JDO极其相似 Spring的JDO模板代表着一套默认的DAO方法 你所要做的就是来定制他们 通常是HQL查询语句 及任何HQL参数化查询中参数的可能取值 接着Spring拿到控制权 获得session 发动查询并且处理任何的异常 再次重申 你看到独特的平衡 示例 给了在不使用Spring时 你不得不编写的典型的Hibernate之方法 Example 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 }示例 再次表明了在Spring中实现查找的相应代码 Example HibRentABike java public List getBikes( ) {return getHibernateTemplate( ) find( from Bike ) }

新手需要特别注意本文代码中的黑体字部分 应用程序的每一代码块必须尽力完成好一个功能 且只能一个

关于…

…Hibernate的替代品?Hibernate确实是免费的 运行速度快的 有效且是流行的 它已经受住了考验 且有着极其优秀的性能和灵活性 大部分的工具中有着很好的Hibernate支持 并且Hibernate支持所有相关的数据库 但我仍只推荐在小型和大型的应用中使用Hibernate

到目前为止 H作为一开源框架 持久化社区不能过多地赞扬Hibernate或声讨其替代者 如此盲目的拥趸导致了礼教崇拜式的决策 Hibernate的竞争者们在某些方面比她做得更好 若你的应用程序有以下的特征 不妨试一试其他的解决方案

标准JDO和JDBC解决方案已然成为标准 尽管Hibernate是开源的 但她还未被确认为标准 在过去的十年中 你得信赖JBoss 组织和基金会的动机来做正确的事情 且对任何的框架而言 至今已证明那是不可靠的地位

管理其他的解决方案易于管理 如Kodo JDO和Top Link就有管理面板 用他们很容易地来监控缓存状态 及主动(eager)加载或延迟加载的状态

映射其他的框架有着功能更强大的和更加灵活的映射支持 若你不想对你的数据库schema进行控制 你最好选用其他的解决方案 你可能也喜欢用GUI工具来映射你的schema 那么 象JDO Genie 或Cayenne可能就最适合你的应用

总而言之 使用主流的框架或许最终可能是正确的选择 但通常情况下 只要稍微深入的探究 你就可以找到更加合适的解决方案 Hibernate确实值得考虑 但别忘了还有其他好的选择

运行一个测试用例

运行测试用例是很容易的事 你已经学会了 它就是你在fa?ade 上运行的那个测试用例

我该怎么办?

由于测试用例已存在 因此你可以运行现有的fa?ade测试 你仅要确保正确设置测试数据即可 且你可以使用未被变更过的应用上下文 那就是Spring的强大之处 可测试性

发生了什么事?

你使用过已存在的测试用例 这很好 因为你只需要管理数据库增长的细节 在下章中 你将开始深入学习可在Spring AOP的应用程序中添加的服务的相关知识

lishixinzhi/Article/program/Java/ky/201311/28074

Castor JDO 概述

Castor JDO是一个纯Java的对象关系(O/R)映射和数据绑定框架。Castor使用用户定义的映射信息在关系数据库和Java对象之间建立起映射转换关系。从另一个层面说,Castor JDO为Java对象提供了一个数据持久层。

Castor JDO对于Java对象的 *** 作被自动转换为对数据库的查询,更新,插入和删除 *** 作。在事务边界中,对于Java对象的修改,在执行提交(commit) *** 作时自动提交给数据源。因此, Java开发人员在构建了数据库表和映射信息后,视角的重心从数据库 *** 作层面转移到Java对象的 *** 作上。Castor JDO将数据的序列化和业务逻辑分离为更好的进行面向对象的设计提供了支持,这在大型项目中特别重要。

Castor JDO采用类似于Castor XML样式的Mapping映射文件。下文我们将详述Castor JDO的概念与应用。

2. 功能特性

Ø Castor JDO是一个事务框架。当数据对象被Castor加载后,Castor会对该数据对象进行锁定并对其他事务隔离。Castor通过xa.Synchronzation支持完整的两阶衫碰段事务提交。Castor提供数据对象的“shared”、“exclusive”、“database locked”和“read-only”等多种数据读写策略。

n 共享读(shared),Castor默认的数据锁定策略,在多个事务查询同一数据对象,更新 *** 作作用于各自的对象拷贝时适用。

n 排斥读(exclusive),Castor提供一个内存锁,多个事务在同一数据对象上执行更新 *** 作时,以竞争的方式获取内存锁来完成对象的更新 *** 作。

n 数据库锁(dabase locked),此策略应用于多个应用程序同时访问数据库数据的场景,如果其他应用程序使用Castor以外的其他方式访问数据库,则考虑使用该策略。

n 只读(read-only),不对数据做任何锁定。使用该策略的所有数据对象都不加锁,这些对象也不参与事务提交和回滚。

Ø 支持“长时间事务(long transactions)”,通过内置的数据“脏检查(dirty-checking)”防止用户在初始事务中对数据变更后被重复修改,从而允许用户在一个事务内读取对象,修改更新,然后在第二个事务中提交。通过自动的数据“伏亏脏检查(dirty-checking)”和死锁侦测,Castor可以确保数据的一致性并减少不必要的数据库更新 *** 作。

Ø 支持OMG(Object Management Group)3.0对象查询语言规范OQL的一个子集用来与数据库进行交互。OQL与SQL类似,但其 *** 作作用于Java对象而不是数据库表。

Ø 实现了一个数据缓存池来减少数据库的频繁访问,同时提供了几种可选的LRU类型的缓存策略。

Ø 支持一对一,一对多,多对多等多种数据库关系,支持对象和数据库记录的继承。Castor区分对象数据生命周期中的关联(如联合)和依赖(如聚合)关系,在各自对象的生命周期中,自动创建和删除依赖的对象数据。

Ø 支持数据库表多主键,并提供多种主键生成器。

Ø 自动处理包含Java集合类型的对象的存缺塌神储,包括Vector,Hashtable,Collection,Set和Map。通过“延迟加载”减少不必要的数据库访问。延迟加载可以在每一个集合类型的字段上设定。

Ø 支持Java对象类型与数据库类型间的自动转换。

Ø Castor JDO在同一个应用中使用多个类加载器,使得其可以在EJB容器或Servlet容器中使用。

Ø Castor XML框架和Castor JDO可以无缝集成使用,同时处理O/R映射和Java对象-XML 数据绑定。

Ø Castor JDO支持以下数据库系统:

n DB2

n Derby

n Generic DBMS

n Hypersonic SQL

n Informix

n InstantDB

n Interbase

n MySQL

n Oracle (8.1.x,9.x,10g)

n PostgreSQL

n Progress

n SAP DB / MaxDB

n SQLServer

n Sybase

用户可以针对特定数据库提供自己的JDBC驱动接口实现插入到Castor中,前提是该数据库支持JDBC2.0,多结果集(ResultSet)和事务。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12232883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存