这一段时间在学习JDO,使用的学习资料是孙宾翻译的《Java Data Objects 第一章 初步概览》,以及清华大学出版社出版的《JDO核心技术》。说实话,这两份学习资料的确很好,但在学习过程中还是遇到了问题,经历了不少痛苦,这里写出来供大家一笑。
  首先,我想对类库进行一下说明。孙宾翻译的《Java Data Objects 第一章 初步概览》(以下简称《JDO》)中所涉及的jdo.jar、jdori.jar、btree.jar、jta.jar、antlr.jar和xerces.jar等6个类库是完全正确的,但由于有些类库已经推出了新版本,因此在获取的时候,可能会遇到一些问题,这里说明一下:

  1.jdo-1_0_1-ri.zip,Sun公司提供的参考实现,版本1.0.1,获取地址:http://jcp.org/aboutJava/communityprocess/final/jsr012/index2.html。需要其中的jdo.jar、jdori.jar、btree.jar等3个类库,也就是《JDO》中提到的前3个类库。

  2.jta-1_0_1B-classes.zip,Sun公司提供的Java的事务控制API,版本1.0.1B,获取地址:http://java.sun.com/products/jta/index.html。这里需要注意,jta-1_0_1B-classes.zip虽然是个压缩包,但打开后会发现里边都是一些.class文件,这与《JDO》中提到的jta.jar有出入。但在使用时可以直接使用该压缩包,因为.jar文件的压缩格式是以.zip文件为基础的。

  3.antlr-2.7.5.jar,获取地址:http://www.antlr.org/download.html,已经不是《JDO》中所说的2.7.0了,但2.7.0也可以从该页面的底部获得。

  4. Xerces-J-bin.2.7.0.zip,由Apache提供的XML解析器,获取地址:http://archive.apache.org/dist/xml/xerces-j/,需要其中的xml-apis.jar和xercesImpl.jar这两个文件。虽然已经与《JDO》介绍的内容有很大出入,但使用起来效果是一样的。如果想使用Xerces 1.4.3,可以从http://xml.apache.org/dist/xerces-j/old_xerces1/中获得。

  下面,再介绍一下增强器。JDO是通过对象进行操作的,但要使用对象,仅有Bean和.jdo元数据文件还不够,因为性能和安全性也是必须考虑的问题。在JDO中对性能和安全性的提高是通过实现PersistenceCapable接口来做到的,但每次都让用户来实现PersistenceCapable接口实在是很麻烦,于是就有了增强器。增强器的作用就是帮助用户自动实现PersistenceCapable接口。虽然《JDO》中对增强器的使用已经做了介绍,但这里还是要说明一点,也就是关于classpath的问题。要使用增强器,除需要使用到jdo.jar和jdori.jar这两个类库外,还需要Bean的路径。配置classpath的方法有两种,一种是配置环境变量classpath,一种是在执行增强器时使用-classpath参数,我使用的方式就是后者。我将类库放在了我机器的 G:/ORM/lib/JDORI中,将Bean和.jdo文件放在了G:/ORM/JB/JDORI/classes下的piv.zheng.jdo.jdori包中,类名Book,代码如下:
  package piv.zheng.jdo.jdori;
  
  public class Book {
    
    private String id = null;
    private String name = null;

    public String getId() {
      return id;
    }
    public void setId(String id) {
      this.id = id;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
  }
.jdo文件名为Book.jdo,内容如下:
  <?xml version="1.0"?>
  <!DOCTYPE jdo PUBLIC
    "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 1.0//EN"
    "http://java.sun.com/dtd/jdo_1_0.dtd">
  <jdo>
    <package name="piv.zheng.jdo.jdori">
      <class name="Book"/>
    </package>
  </jdo>
我执行的增强器命令:
  java –classpath /
 G:/ORM/lib/JDORI/jdo.jar;G:/ORM/lib/JDORI/jdori.jar;G:/ORM/JB/JDORI/classes /
  com.sun.jdori.enhancer.Main piv/zheng/jdo/jdori/Book.jdo piv/zheng/jdo/jdori/Book.class
你可能注意到了,对于com.sun.jdori.enhancer.Main我没有使用-d参数。-d参数用来指明将要存放增强后的类文件的目录,但并非必须的,如果不指定,增强器会根据当前路径进行存放。那么什么是当前路径呢?例如执行命令前把命令提示符的路径指定到了G:/ORM/JB/JDORI,那么这个路径就是当前路径,当执行过增强器后,该路径下会生成包piv.zheng.jdo.jdori,包里有一个类Book,你会发现,这个类比原来的大了很多,这就是增强过的类了;如果把路径指定到G:/ORM/JB/JDORI/classes,那么增强过的类会覆盖原来的类,如果你跟我一样只是学习,后一种方法很省事的。
  下面说一个最令我汗颜的问题。《JDO》在提供示例时,使用了Sun提供的JDO参考实现,用的是com.sun.jdori.fostore.FOStorePMF类,我用这个类连了半天MySQL和PostgreSQL,死活就是不好使,最后才注意到FOStorePMF的含义,居然是用来连接文件对象的。哎,没办法,我对英文从来都只是七窍通六窍。跟我一样情况的朋友,注意一下吧。
  下面是我写的代码:
  package piv.zheng.jdo.jdori;
  
  import java.util.Properties;
  import javax.jdo.PersistenceManagerFactory;
  import javax.jdo.JDOHelper;
  import javax.jdo.PersistenceManager;
  import javax.jdo.Transaction;
  
  public class Client {
    
    public static void main(String[] args) {
      try {
        Properties pros = new Properties();
        pros.put("javax.jdo.PersistenceManagerFactoryClass", "com.sun.jdori.fostore.FOStorePMF");
        pros.put("javax.jdo.option.ConnectionURL", "fostore:db/test");
        pros.put("javax.jdo.option.ConnectionUserName", "zheng");
        pros.put("javax.jdo.option.ConnectionPassword", "111111");
        pros.put("com.sun.jdori.option.ConnectionCreate", "true");
        PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(pros);
        PersistenceManager pm = pmf.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        tx.begin();
        tx.commit();
        System.err.println("成功!");
      } catch (Exception e) {
        System.err.println("出错!");
        e.printStackTrace();
      }
    }
  }
因为《JDO》里已经介绍的很明白了,所以这里我将注释去掉了。不过还有一个问题需要注意,就是

pros.put("javax.jdo.option.ConnectionURL", "fostore:db/test");

这句代码,我们需要在工程目录下建一个名为db的目录,以存放要创建的test数据库文件,执行后,该目录下会生成两个文件test.btd和test.btx,这两个文件就是所谓的文件对象了。
  由于Sun提供的JDO参考实现实在是不好用,而且听说性能也很糟,所以决定放弃。下边打算学习一下TJDO,虽然都是JDO实现,但应该会好些吧^_^

JDO学习笔记之Sun JDO参考实现篇相关推荐

  1. 【学习笔记】 科目一之概念篇

    [学习笔记] 科目一之概念篇 概念题方法 1)抓重点:科目一设计知识范围太广,不要妄想所有知识点都复习到,这是不可能的,我们的目标是45分几个而不是考高分,复习时间有限,所以要学会抓重点,比如法律条文 ...

  2. 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)

    单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...

  3. 单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)

    带头结点的单链表逆置 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出 ...

  4. Spring.NET学习笔记10——方法的注入(基础篇) Level 200

    多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...

  5. Docker学习笔记_网上资源参考

    Docker学习,网上资源参考 1.菜鸟教程:                                                        http://www.runoob.com ...

  6. 基于YOLOv3算法的交通标志识别系统实现流程(个人学习笔记,仅当参考!!)

    总流程 安装darknet 本文利用linux操作系统上安装的Darknet开源轻型深度学习框架,为了提高训练速度利用CUDA和OPENCV 进行编译,完成对YOLO v3算法LISA数据集中四类不同 ...

  7. TypeScript 学习笔记(一)—— 参考哔哩哔哩整理的笔记

    1.TypeScript 介绍 .自动编译 1.1 介绍 TypeScript 是由 微软 开发的开源语言 TypeScript 是 Javascript 的超集,遵循最新的 ES6.ES5 规范,扩 ...

  8. JavaScript学习笔记(四)之浏览器篇

    目录 1.内核版本 2.浏览器对象 window navigator screen location document cookies history 3.操作DOM 插播querySelector语 ...

  9. Java学习笔记分享之Spring Cloud Netflix篇(上)

    Spring Cloud Netflix Spring Cloud 是什么 [百度百科]Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基 ...

最新文章

  1. Nature子刊:加州大学伯克利分校Banfield组发现某些淡水湖泊中的大噬菌体或能加速好氧甲烷氧化...
  2. android 平板安装程序开发者,android – 限制平板电脑中的应用安装
  3. 小学生们在B站讲算法,网友:我只会阿巴阿巴
  4. mysql查询某属性下所有值的前N条记录
  5. 前端入门CSS(3)
  6. linux和python的关系_Python、Linux与我的缘分
  7. php pdo fetchassoc,pdo执行fetch查询语句,出现500错误,请问应该怎么写
  8. linux用grep查找文件内容
  9. html 标题栏小图标 ,锚点,视频插入,音乐插入
  10. Vue项目在nginx下的部署实践(个人学习总结)
  11. GPS模拟器与Windows Mobile模拟器
  12. MENTOR PADS软件菜单显示不完整?这里有妙招
  13. RubyOnRails 在linux平台安装的过程
  14. 求最大公约数(辗转相除法)
  15. 增值税下调对财务软件的影响
  16. Tree Walk(二叉树的遍历)
  17. 数字IC后端笔试500题出炉(附答案)
  18. 读文献--《U-Net: Convolution Networks for Biomedical Image Segmentation 》
  19. SPI NAND flash 简介
  20. 中国不是不能开发出自己的浏览器,而是没必要

热门文章

  1. 【mac】No Xcode or CLT version detected!解决办法
  2. 项目经理如何让自己更强大,执行力很关键
  3. 学习mongo系列(四) find().pretty() remove() 查询
  4. PULT:Progressive Unsupervised Learning for Visual Object Tracking(用于视觉目标跟踪的渐进式无监督学习)
  5. IE浏览器报错Unhandled promise rejection Error: 拒绝访问。文件流下载
  6. c#轻松实现磁性窗口
  7. Qt使用三点坐标画圆弧
  8. iOS---自动释放池
  9. 蓝桥杯: Cowboys
  10. 用 vue-cli 手脚架 建立一个 webpack 模板 vue 项目