环境准备
由于 Kodo 是基于注释机制的框架,我们必须使用 JDK5.0 完成开发工作。所以下载、安装 Kodo 之前,请确保您已经下载和安装了 JDK5.0 。
为了演示的需要,我们选择 MySQL 数据库作为持久化的目标数据库,请大家自己到 www.mysql.com 下载最新的 MySQL 数据库后安装。
安装 Kodo
Kodo 的最新版本是 Kodo 4.0.0 Early Access 4 ,目前大家可以到 http://www.solarmetric.com/ 去下载试用版本,下载时需要注册,你会得到 30 天的 License 。
将下载的压缩文件解压到 c:/kodo4 目录下 ( 后面将使用 %KODO_HOME% 来引用这个目录 ) ,打开 %KODO_HOME%/bin/kodocmd.cmd 文件,将其中的 KODODIR 设置为您的 Kodo 的安装目录,将 JDKHOME 设置为 Java 的安装目录。
安装 Weblogic9
Kodo EJB 在 JAVA EE 环境下运行时需要 EJB 容器支持 EJB3 标准, BEA 最新发布的 Weblogic9 服务器就支持 EJB3 标准,因此我们选择 Weblogic9 作为演示时使用的目标服务器。大家可以到 http://www.bea.com 下载 Weblogic9 ,然后将 Weblogic9 安装到自己的机器上。
[ 注 ] 本文中的实例是实现可远程访问的 EJB 实例,因此你可以将 Weblogic9 安装到其他机器上,不过客户端调用的时候需要增加一些环境变量,请参考后面的说明。
开发 Kodo EJB 应用
由于篇幅的关系,我们直接使用《 Kodo EJB :符合 EJB3 规范的持久层框架》一文中已经创建好的例子,包括环境准备、持久化类创建、数据库创建等工作,下面的章节中将尽量不再重复《 Kodo EJB :符合 EJB3 规范的持久层框架》一文中已经提到的步骤,而是重点描述需要额外完成的工作。
在 EJB 开发中,我们通常都采用 Session Fa?ade 设计模式,因此下面的例子也使用了这种设计模式来封装 Kodo EJB 应用。
我们使用一个无状态的 Session Bean 来封装对 Book 类的所有操作,由于 Kodo EJB 应用中需要开发者完成 kodo.persistence.EntityManagerFactoryImpl 的实例到 JNDI 的绑定,我们把这部分工作访在 Session Bean 中完成,下面是 Session Bean 的接口和实现的全部代码,请注意代码中增加的注释,他们有助于您了解 Kodo EJB 如何工作的。
BookBean 类
下面是 BookBean 类的源代码,请大家特别注意 BookBean 类中的 setSessionContext 方法,其中的代码将 kodo.persistence.EntityManagerFactoryImpl 的实例绑定到 JNDI 上。
package org.vivianj.kodo.examples.ejb.stateless;
import java.rmi.RemoteException;
import java.util.Collection;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;
import kodo.persistence.KodoPersistence;
import org.vivianj.kodo.examples.beans.Book;
/**
* BookBean 提供 Session Bean 的实现类
*/
public class BookBean implements SessionBean {
protected SessionContext ctx;
private EntityManagerFactory emf;
/**
* getBookById 根据 Book 对象的 id 属性查找、返回符合条件的 Book 对象
*
* @param id
* Book 对象的编号
* @return 编号为 id 的 Book 对象
* @throws RemoteException
*/
public Book getBookById(int id) throws RemoteException {
/* 获得 EJB 的实体管理器 */
EntityManager em = emf
.createEntityManager(PersistenceContextType.EXTENDED);
try {
/* 开始事务 */
em.getTransaction().begin();
/* 处理业务 */
Book book = em.find(Book.class, id);
/* 结束事务 */
em.getTransaction().commit();
return book;
} finally {
/* 关闭 EJB 实体管理器 */
em.close();
}
}
/**
* updateBook 更新 Book 对象的信息
*
* @param book
* 需要更新的 Book 对象
* @throws RemoteException
*/
public void updateBook(Book book) throws RemoteException {
/* 获得 EJB 的实体管理器 */
EntityManager em = emf.getEntityManager();
try {
/* 开始事务 */
em.getTransaction().begin();
/* 处理业务 */
em.merge(book);
/* 结束事务 */
em.getTransaction().commit();
} finally {
/* 关闭 EJB 实体管理器 */
em.close();
}
}
/**
* createBook 方法用于持久化新的 Book 对象
*
* @param book
* 被持久化的 Book 对象
* @throws RemoteException
*/
public void createBook(Book book) throws RemoteException {
/* 获得 EJB 的实体管理器 */
EntityManager em = emf.getEntityManager();
try {
/* 开始事务 */
em.getTransaction().begin();
/* 处理业务 */
em.persist(book);
/* 结束事务 */