JDO
示例
-
JPOX
(ALin 2006-12-27 00:28)
第一部分:相关概念
[JDO
的实现版本之一:
JPOX]
JPOX
是
JDO
的一个具体实现版本。其官方主页为:
http://www.jpox.org/index.jsp
JDO
现在是
2.0
版,以前的
1.0
版的
Sun
官方有具体的实现,不过后来移交给
Apache
了,所以
Apache
网站上也有
JDO
的实现。这种标准的
API
加上具体的实现的方式在
Java
相关技术中很常见。下载
JPOX1.1.4
版。
[
可持久化类
]
JDO
规范定义了作为
Java
接口的可持久约定,称之为
PersistenceCapable
,同时还定义了类实现必须遵守的编程风格。遵守该约定的类被定义为是“可持久的”。
JOD
作为一种
ORM
解决方案,使用
JDO
可以有
3
种方法生成可持久类:
<!---->1. <!---->源代码生成,即是实现相关的接口,自己编写相关的方法,在点类似于BMP EJB。
<!---->2. <!---->源代码处理。
<!---->3. <!---->字节码增强(使用字节码增强工具:byte-code enhancer)。
JDO
要求可持久类必须有一个不带参数的构造函数,可以是
public, protected, private,
只要保证定义的类及其潜在的子类能够访问即可。
[JDO
元数据
]
JDO
无数据即是描述可持久化类与数据库相互关系的文件,是以
jdo
为扩展名
XML
文件。假如有一个类为:
alin.scut.jdo.Author
,则描述该类的元数据可以在以下文件中:
<!---->Ø <!---->package.jdo
<!---->Ø <!---->alin/package.jdo
<!---->Ø <!---->alin/scut/package.jdo
<!---->Ø <!---->alin/scut/jdo/package.jdo
<!---->Ø <!---->alin/scut/jdo/Author.jdo
按以上顺序搜索元数据,并使用第一个发现的定义。
[JDO
配置文件
]
和其他的
ORM
框架一样,
JDO
也有一个配置文件,具体的实现可能有不同的配置文件。
JPOX
的配置文件为:
jpox.properties
,作用和
Hibernate
的
hibernate.cfg.xml
文件类似。同时,还应该为
JPOX
提供一个
Log4j
的配置文件,用来输出日志。
第二部分:示例
这个例子只简单地示范可持久化类的创建、删除、更新和查询,不涉及关系部分。当然,为了直观起见,照样不使用
IDE
,而使用简单的文本编辑器和相关的命令行工具。
一、
建立本项目的目录结构,本项目中一共只有一个可持久类,
alin.demo.Author
。项目的根文件夹下面一共
3
个文件夹:
bin, src, lib
。具体各个目录放置什么地球人都知道吧!?
lib
目录下的
JAR
文件就是
JDO2.0
的标准
API
和
JPOX
的实现,由于使用到
Log4j
,因此还要把
Log4j
的
JAR
文件也放到此目录下。最终的目录结构如下:
<Project>
lib
|
jdo.jar(
或者叫
jdo2-api.jar)
|
JDO2.0 AIPI
|
|
jpox.jar
|
JPOX1.1.4
实现
|
jpox-enhancer.jar
|
JPOX
的字节码增强器
|
log4j.jar
|
Log4j
|
bcel.jar
(jboss-4.0.2\server\default\lib
目录下面有
)
|
Byte Code Engineering Library
(BCEL)
,这是
Apache Software
Foundation
的
Jakarta
项目的一部分。
|
src
|
alin/demo/Author.java
|
|
|
alin/main/
……
.java
|
这个包下面的源文件是示例应用程序
|
|
alin/demo/Author.jdo
|
|
jpox.properties
|
注意数据库
URL
后面部分的作用:
SelectMethod=cursor(
后面会说明
)
|
log4j.properties
|
|
bin
|
alin/demo/Author.class
|
|
|
alin/main/
……
.class
|
|
alin/demo/Author.jdo
|
这些文件都是直接从
src
目录下面复制过来的。
|
jpox.properties
|
log4j.properties
|
二、各文件具体内容:
(1)
可持久类
Author.java
代码1: Author.java
// Author.java -- Demostrate JDO.
// 2006-11-25 20:55
package alin.demo;
//import javax.jdo.spi.PersistenceCapable;
//import javax.jdo.JDOHelper;
public class Author {
private int books;
private String name;
public Author(String name, int books) {
this.name = name;
this.books = books;
}
protected Author() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBooks() {
return books;
}
public void setBooks(int books) {
this.books = books;
}
}
(2)
元数据文件
代码
2
:
Author.jdo
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo PUBLIC
"-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN"
"http://java.sun.com/dtd/jdo_2_0.dtd">
<jdo>
<package name="alin.demo">
<class name="Author" identity-type="datastore">
<field name="books" persistence-modifier="persistent">
</field>
<field name="name" persistence-modifier="persistent">
<column length="50" jdbc-type="VARCHAR"/>
</field>
</class>
</package>
</jdo>
(3)JPOX
配置文件,注意这个属性:
javax.jdo.PersistenceManagerFactoryClass
,代表的是
JDO
的
PersistenceManagerFactory
的具体实现,这个值依赖于具体的实现。前面的一组属性是
JDO
的标准属性,任何实现都必须支持的,后面的是
JPOX
的扩展属性。
代码
3
:
jpox.properties
# jpox.properties -- jpox configuration.
# 2006-11-28 19:24
# -- Standard JDO properties. --
javax.jdo.PersistenceManagerFactoryClass=org.jpox.PersistenceManagerFactoryImpl
javax.jdo.option.ConnectionDriverName=com.microsoft.jdbc.sqlserver.SQLServerDriver
javax.jdo.option.ConnectionURL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JDO;SelectMethod=cursor
javax.jdo.option.ConnectionUserName=sa
javax.jdo.option.ConnectionPassword=sqlserversaps
# -- JPOX properties. --
org.jpox.autoCreateSchema=true
org.jpox.validateTables=false
org.jpox.validateConstraints=false
(4) log4j
配置文件
代码
4
:
log4j.properties
# LOG4J Configuration
# ===================
# Basic logging goes to "jpox.log"
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=jpox.log
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n
#log4j.appender.A1.Threshold=INFO