在Java EE环境下使用Kodo EJB

  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文件的结构如下:

    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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, ejb
, import
, weblogic9
, public
, entitymanagerfactory
, throws
, persistence
, 环境weblogic
weblogic日期格式jndi
java ee环境搭建、java ee环境配置、java ee开发环境搭建、java ee环境、java ee jdk 环境配置,以便于您获取更多的相关知识。

时间: 2024-09-06 22:41:02

在Java EE环境下使用Kodo EJB的相关文章

JAVA EE Eclipse下配置Tomcat服务器

在进行Java web编程之前,必须要进行web服务器的配置,这里选择在Java EE(版本) Eclipse中进行服务器的配置.当然了,在安装Java EE Eclipse之前要先安装JDK,并且要在环境变量中配置好JDK的安装目录,在这里不再多说,如果不清楚,可以看前面写的一篇"在win7下面安装JDK(以32位系统为例)"的文章.这里就假设你已经安装好了JDK,并且已经配置好环境变量.      Java EE Eclipse可以去Eclipse公司的网页上去下载最新版本的,但是

安全注释和授权在GlassFish和Java EE 5 SDK中的应用

安全性对于企业环境非常重要.在 Java EE 5 / GlassFish 环境中,您可以通过以下几种方式实现安全性: 传输层安全性 (TLS) / 安全套接字层 (SSL) 技术 身份验证 (Authentication) 和授权 (Authorization) 消息层安全性(仅适用于 GlassFish 中的 Web 服务) 本文讨论身份验证和授权.参考资料 [1].[2] 和 [3] 讨论了如何在客户端和服务器端为 Enterprise JavaBeans 和 Web 服务建立 SSL 环

Java EE应用程序入门

本文将详细介绍使用 EJB 3.0 技术开发企业应用程序的基础知识,而 EJB 3.0 是 Java EE 5 平台的组成部分.本文还将阐述如何通过 EJB 3.0 技术简化开发企业应用程序的流程.本文使用的是 NetBeans IDE 6.0 发行版. 先决条件 本文假定您在以下方面拥有基本知识和编程经验: Java 编程 NetBeans IDE 教程所需软件 对于本教程,您需要在计算机上安装以下软件: "Web & Java EE" 或 "All" 下

ejb-请问基于Java EE的构件规范设计开发构件,指的是使用EJB框架开发构件吗?

问题描述 请问基于Java EE的构件规范设计开发构件,指的是使用EJB框架开发构件吗? 我现在要完成的任务是开发一个可重用构件,这个构件要实现的功能是系统中一个数据处理模块.要求在Java EE 支撑平台下开发.我现在不太能理解这个构件的开发过程.查了资料得知javabean和ejb都可以用Java语言开发组件.javabean比较简单是一般和JSP配合的,开发比较小型的组件使用的.EJB更为复杂功能也全面,但是我的这个系统不是分布式的,也不需要与服务器进行交互.用EJB开发是不是有些不机智?

图片-java ee中的EJB出现错误:

问题描述 java ee中的EJB出现错误: 解决方案 看异常貌似是jdbc/MysqlDB_pm 这个数据源配置的问题

在Windows系统和Eclipse IDE集成环境下使用Java进行HBase客户端编程

本文以HBase 0.90.2为例,介绍如何在Windows系统,Eclipse IDE集成环境下,使用Java语言,进行HBase客户端编程,包含建立表.删除表.插入记录.删除记录.各种方式下的查询操作等. 1. 准备工作 1.下载后安装jdk包(这里使用的是jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008): 2.下载eclipse,解压到本地(这里使用的是eclipse-java-helios-SR2-win32): 3.下载HBase包,解压

在Solaris操作系统上搭建Java EE开发环境

一. 下载JDK JDK 是 Java Development Kit 的缩写,他是整个 Java 的核心,包括了 Java 运行环境( Java Runtime Envirnment ),一些 Java 工具和 Java 基础的类库 (rt.jar) .不论什么 Java 应用服务器实质都是内置了某个版本的 JDK .因此掌握 JDK 是学好 Java 的第一步. Java 开发工具包是免费下载使用的.若需要可以根据不同的操作系统平台,下载相应的 JDK 进行安装,也可以通过我这文章中所提供的

Linux环境下的Java开发(八):Linux和Windows的比较

在我刚开篇写这一系列随笔的时候,就有人问:在Linux下进行Java开发究竟 有什么优势,如果都是一样安装JDK.安装Eclipse,那和Windows下开发有什么区 别?这个问题问得很尖锐,的确,我们似乎根本没有必要把我们的工作从Windows 中转移到Linux中来. 在Linux系统中进行开发,和在Windows中进行开发相比较起来,即有优点,也 有缺点.下面是我的一些意见,欢迎大家讨论. 先来说说优势: 1.由Linux系统的本质决定的: Linux的本质有三点,一是开源,二是免费,三是

Linux环境下的Java开发(七):“乱花渐欲迷人眼”的开源框架

江南白衣在2005年9月的时候,就在他的博客上提出:每个团队都应该有一个 Appfuse式的项目,用来演示团队目前的体系框架和设计模式.这种项目的好处有 一打:比如为所有项目提供共同的Library Stack,提供最可靠的代码蓝本,保证 大家的模式和代码风格一致,加快知识在团队的传播,方便新人的融入,还有为 试验代码提供一个稳定简洁的环境.而且,构建或者使用这样的项目要遵守几条 铁的纪律:一是强制更新,所有团队approval的最新模式都要refactor到 MyAppfuse中:二是规范更新