<%@ page contentType="text/html; charset=gb2312"%> 在Java EE环境下使用Kodo EJB
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
在Java EE环境下使用Kodo EJB
     发布者: 发布时间:2006-07-01
  Kodo EJB是一个支持对象/关系映射的框架,根据EJB3规范的要求,Kodo EJB除了支持在普通Java应用中提供轻量级的持久层框架之外,也支持在JAVA EE容器中使用满足重量级企业应用的需求,充分利用JAVA EE容器中提供的优越特性如容器管理事务、远程(Remote)访问。

  基于Kodo EJB开发的应用支持使用EJB或者JCA标准接入到JAVA EE环境中:
  1. JCA

    Kodo EJB支持JCA1.0标准,因此基于Kodo EJB开发的应用可以和其他JCA资源一样轻松的发布到JAVA EE应用服务器上。

  2. JNDI

    另外一种方式是将kodo.persistence.EntityManagerFactoryImpl的一个实例绑定到JNDI,然后通过查找JNDI的方式使用Kodo EJB应用。虽然这种方式需要开发者根据不同的JAVA EE容器编写代码才能完成,但是这种方式能够保持最大限度的JAVA EE容器可移植性,而且为在那些不支持JCA标准的JAVA EE容器中使用Kodo EJB创造可能。

  本文中我们将以通过一个简单的例子,简单的讲解和演示如何在Weblogic9上通过JNDI方式来访问Kodo EJB应用。
  环境准备

  由于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); 
   /* 结束事务 */ 
   em.getTransaction().commit(); 
  } finally { 

   /* 关闭EJB实体管理器 */ 
   em.close(); 
  } 
 } 

 public void deleteBook(Book book) throws RemoteException { 
  /* 获得EJB的实体管理器 */ 
  EntityManager em = emf.getEntityManager(); 
  try { 
   /* 开始事务 */ 
   em.getTransaction().begin(); 
   /* 处理业务 */ 
   Query q = em.createQuery("delete from Book c where c.id = :id"); 
   q.setParameter("id", book.id); 
   q.executeUpdate(); 
   /* 结束事务 */ 
   em.getTransaction().commit(); 
  } finally { 
   /* 关闭EJB实体管理器 */ 
   em.close(); 
  } 
 } 

 public Collection getBooks(String queryString) throws RemoteException { 
  /* 获得EJB的实体管理器 */ 
  EntityManager em = emf.getEntityManager(); 
  try { 
   /* 开始事务 */ 
   em.getTransaction().begin(); 
   /* 处理业务 */ 
   List allBooks = em.createQuery(queryString).getResultList(); 
   /* 结束事务 */ 
   em.getTransaction().commit(); 
   return allBooks; 
  } finally { 
   /* 关闭EJB实体管理器 */ 
   em.close(); 
  } 
 } 

 public void setSessionContext(SessionContext ctx) { 
  this.ctx = ctx; 
  try { 
   /* 获取JAVA EE容器上下文环境 */ 
   Context ejbContext = new InitialContext (); 
   Object o = null; 
    
   try{ 
    /* 根据JNDI查找kodo.persistence.EntityManagerFactoryImpl的实例 */ 
    o = ejbContext.lookup("ejb/kodo/emf"); 
   }catch(Exception e){ 
    /* 如果没有找到,尝试将kodo.persistence.EntityManagerFactoryIm 
    pl的实例绑定到JNDI上 */ 
    EntityManagerFactory emfForEjb = 
    Persistence.createEntityManagerFactory(null); 
    ejbContext.bind("ejb/kodo/emf",emfForEjb); 
   } 
   if (o == null) 
   { 
    /* 如果没有找到,尝试再次查找 */ 
    emf = (EntityManagerFactory)ejbContext.lookup("ejb/kodo/emf"); 
   } 
   else { 
    emf = (EntityManagerFactory)o; 
   } 

  } catch (NamingException e) { 
   throw new RuntimeException(e); 
  } 
 } 

 public void ejbCreate() throws RemoteException { 
 } 

 public void ejbActivate() throws EJBException, RemoteException { 
 } 

 public void ejbPassivate() throws EJBException, RemoteException { 
 } 

 public void ejbRemove() throws EJBException, RemoteException { 
 } 

 public void unsetSessionContext() { 
  ctx = null; 
 } 
} 
BookHome接口
package org.vivianj.kodo.examples.ejb.stateless; 

import java.rmi.RemoteException; 

import javax.ejb.CreateException; 
import javax.ejb.EJBHome; 

/** 
 * BookHome 类提供Session Bean的home接口 
 */ 
public interface BookHome extends EJBHome { 
 public BookRemote create() throws CreateException, RemoteException; 
} 
BookRemote接口
package org.vivianj.kodo.examples.ejb.stateless; 

import java.rmi.RemoteException; 
import java.util.Collection; 

import javax.ejb.EJBObject; 

import org.vivianj.kodo.examples.beans.Book; 

/** 
 * BookRemote 类提供Session Bean的remote接口 
 */ 
public interface BookRemote extends EJBObject { 
 public Book getBookById(int id) throws RemoteException; 

 public void updateBook(Book book) throws RemoteException; 

 public void createBook(Book book) throws RemoteException; 

 public void deleteBook(Book book) throws RemoteException; 

 public Collection getBooks(String queryString) throws RemoteException; 

} 
  编写EJB描述符文件 

  为了将该Session Bean发布到Weblogic9中,我们还需要提供两个配置文件:ejb-jar.xml和weblogic-ejb-jar.xml,作者提供的演示实例中,这两个文件的内容如下,开发者可以根据自己的实际环境进行调整。

  ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar 
 xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1"> <display-name>Sample Kodo EJB</display-name> <enterprise-beans> <session> <ejb-name>BookEJB</ejb-name> <home>org.vivianj.kodo.examples.ejb.stateless.BookHome</home> <remote>org.vivianj.kodo.examples.ejb.stateless.BookRemote</remote> <ejb-class>org.vivianj.kodo.examples.ejb.stateless.BookBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>BookEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
weblogic-ejb-jar.xml
<?xml version="1.0"?> 
<weblogic-ejb-jar 
 xmlns="http://www.bea.com/ns/weblogic/90"  
 xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 
 http://www.bea.com/ns/weblogic/90/weblogic-ejb-jar.xsd"> 
 <weblogic-enterprise-bean> 
  <ejb-name>BookEJB</ejb-name> 
  <jndi-name>ejb/kodo/book</jndi-name> 
 </weblogic-enterprise-bean> 
</weblogic-ejb-jar> 
  打包部署

  基于Kodo EJB开发的EJB打包和通常的EJB打包没有什么特别,部署过程也没有什么特别,比较简单的方式是使用配置工具创建新的域后,将打包好的EJB jar文件直接拷贝到域目录下的autodeploy目录下。

  完整地打包部署过程这里不再赘述,如果大家还不是十分熟悉,请大家参考Weblogic Server的在线帮助文档http://edocs.bea.com/wls/docs91/index.html

  在这里要给大家介绍的是创建Weblogic9域后如何配置Kodo的两部分内容:
  1. 安装Kodo

    Windows平台下创建Weblogic9域后,可以在该域所在目录下找到bin目录下的setDomainEnv.cmd文件。打开该文件,在其中找到set PRE_CLASSPATH=这一行,这里假如地jar文件将被加入Weblogic9服务器的启动CLASSPATH中,因此我们把%KODO_HOME%/lib目录下所有jar文件增加到PRE_CLASSPATH中。下面是作者的设置情况(没有全部填写完整,请开发者根据实际情况填写完整)。

    set PRE_CLASSPATH= F:/OpenSource/kodo-4.0.0EA4/lib/kodo.jar; F:/OpenSource/kodo-4.0.0EA4/lib/jta-spec1_0_1.jar;F:/OpenSource/kodo-4.0.0EA4/lib/jca1.0.jar;F:/OpenSource/kodo-4.0.0EA4/lib/jdo-2.0.jar;

    可选择的,你可以将数据库服务器的驱动jar和其他应用中需要的jar文件放在这个变量下。
  1. 提供Kodo的license

    Kodo使用时需要提供License文件,在《Kodo EJB:符合EJB3规范的持久层框架》一文中,我们知道Kodo的License信息保存在应用的META-INF目录中的kodo.xml文件中,和应用一起使用,可是在JAVA EE环境下,我们是将kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI服务上,这个过程是服务器完成的,将License放在EJB包中并不能让服务器获取License的信息,查看Kodo的帮助文档,也没有看到相应的实施指南,不过作者经过测试后发现下面的方法可以完成这部分工作。
    1. 准备一个license.jar文件
      license.jar中包含META-INF目录,该目录下包含有提供Kodo License的kodo.xml文件。license.jar文件的结构如下:

      license.jar中包含META-INF目录

    2. 将该jar文件加入到Weblogic域的CLASSPATH中

      请参考前面一步“安装Kodo”的步骤将license.jar文件加入Weblogic域的CLASSPATH中。
  测试

  现在,启动服务器,编写段简单的测试代码,看看EJB是否能够正常开始工作,下面这段代码可以用于测试从EJB中查找符合要求的Book对象并打印它的name属性。
/* 提供Weblogic服务器的信息 */ 
Hashtable<String,String> h = new Hashtable<String,String>(); 
 h.put(Context.INITIAL_CONTEXT_FACTORY, 
     "weblogic.jndi.WLInitialContextFactory"); 
 h.put(Context.PROVIDER_URL, "t3://localhost:7001"); 

/* 获取指定服务器的上下文路径 */  
Context ctx = new InitialContext(h); 
/* 从JNDI中获取Session Bean的home接口 */ 
Object o = ctx.lookup("ejb/kodo/book"); 
BookHome home = (BookHome) PortableRemoteObject.narrow(o,BookHome.class); 

/* 获得Session Bean的remote接口 */ 
BookRemote remote = home.create(); 

/* 调用业务方法 */ 
System.out.println(remote.getBookById(1).name); 

  执行客户端的时候,请将%KODO_HOME%/lib目录下的jar文件和Weblogic服务器安装目录下的server/lib/weblogic.jar文件都放在CLASSPATH中。

  总结

  在EJB3的标准中,EJB3应用既可以用于Java SE环境中,同时还可以用于Java EE环境下使用。Kodo EJB中提供了两种不同的方式支持在Java EE环境下使用:JCA和JNDI,其中JCA方式比较简单,而JNDI方式则能够提供更好的灵活性。

  在本文中,作者以一个简单的例子说明了在Weblogic9中如何将Kodo EJB中kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI上,通过JNDI访问Kodo EJB应用中的持久化类。

  参考资源:

  EJB3规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr220/index.html
  JDO2规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr243/index.html
  Kodo在线文档:http://solarmetric.com/kodo/Documentation/4.0.0EA4/docs/full/html/index.html
  Weblogic9在线文档:http://edocs.bea.com/wls/docs91/index.html

  下载资源kodoejb-JavaEE.jar
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
利用EJB 3.0的JPA设计企业应用程序
EJB 3.0是Hibernate的克隆吗?
java实现音频播放
在服务器上安装、使用mysql的注意事项
mysql完全入门(windows版)
mysql优化简明指南
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(8340)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(2579)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(1149)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(8573)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(5506)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号