JDO(Java Data Objects)数据持久化标准
一、基础定义
JDO = Java Data Objects,Java对象持久化规范 由JCP制定规范:
- JDO1.0:JSR-12
- JDO2.0/3.x:JSR-243,现由Apache维护,主流实现:DataNucleus
核心定位:透明对象持久化标准,让普通POJO直接持久化到各类存储,不用手写SQL。
二、核心思想:透明持久化
- 纯POJO编程 持久化类无需实现特定接口、不用继承父类,就是普通Java Bean;通过字节码增强(Enhancer) 在编译期植入持久化逻辑,自动追踪对象字段修改、自动读写存储。
- 面向对象操作,屏蔽底层存储 你只操作Java对象,增删改查底层自动完成,几乎不写SQL。
- 多存储兼容(JDO最大特色) 不只支持关系数据库,同时兼容:对象数据库、MongoDB等NoSQL、XML文件、普通文件、Excel等异构存储。
三、核心API组件
- PersistenceManager(PM)
持久化核心入口,管理对象生命周期、创建查询、开启事务,等同于JPA的
EntityManager。 - Transaction 事务控制,支持乐观锁/悲观锁。
- Query + JDOQL 专属查询语言JDOQL,完全基于Java对象语法,无SQL依赖,一套查询可适配所有存储; 示例:查询18岁以上用户
Query q = pm.newQuery(User.class, "age >= 18");
List<User> list = q.execute();
- 元数据Metadata 定义对象与存储映射,支持三种方式:注解、XML配置、API动态配置。
四、持久化对象生命周期(JDO独有状态)
- 瞬时态 Transient:普通内存对象,和持久层无关
- 持久态 Persistent:与PM绑定,修改字段自动同步存储
- 游离态 Detached:脱离PM,仍携带持久状态,可重新附着更新数据库
- 删除态 Persistent-Deleted:标记待删除,事务提交后移除
五、JDO核心优势
- 存储无关性:一套代码切换关系库、NoSQL、文件,无需大幅改造;
- 完全面向对象:原生支持继承、多态、复杂对象关联映射(对应你前面学的面向对象继承/多态);
- 透明变更追踪:修改对象属性自动检测,自动生成更新语句;
- 无侵入POJO:代码不绑定持久化框架,业务与存储解耦;
- 统一JDOQL,跨存储通用查询。
六、JDO vs JPA
| 对比项 | JDO | JPA |
|---|---|---|
| 规范定位 | 通用对象持久化,不限存储 | Java EE标准ORM,仅关系数据库 |
| 存储支持 | RDB、NoSQL、文件、对象库 | 仅限关系型数据库 |
| 查询语言 | JDOQL(纯对象语法) | JPQL(类SQL语法) |
| 侵入性 | 极低,纯POJO | 有约束(不能final类、必须无参构造等) |
| 诞生背景 | 独立持久化标准(JSR12) | EJB3产物,吸收JDO思想简化而来 |
| 现状 | 小众,多存储异构场景使用 | 主流企业Java持久化方案 |
区分点
- 出现:多数据源、文件/对象数据库、透明存储、跨存储 → 选JDO
- 出现:ORM、关系数据库、JavaEE、JPQL、Hibernate → 选JPA
七、简单执行流程
- 编写普通POJO实体类;
- 字节码增强,植入持久化逻辑;
- 通过PersistenceManager获取对象、新建对象;
- 操作对象属性,JDO自动同步数据库;
- JDOQL查询对象,事务提交完成持久化。
八、极简
JDO是Java平台标准化对象持久化API,核心是透明持久化,依托字节码增强实现POJO持久化;支持关系库、NoSQL、文件等多种存储,使用JDOQL面向对象查询;区别于只针对关系库的JPA。
注意:本文归作者所有,未经作者允许,不得转载