|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。 KodoEJB是一个撑持对象/干系映照的框架,依据EJB3标准的请求,KodoEJB除撑持在一般Java使用中供应轻量级的耐久层框架以外,也撑持在JAVAEE容器中利用满意分量级企业使用的需求,充实使用JAVAEE容器中供应的优胜特征如容器办理事件、远程(Remote)会见。
基于KodoEJB开辟的使用撑持利用EJB大概JCA尺度接进到JAVAEE情况中:
- JCA
KodoEJB撑持JCA1.0尺度,因而基于KodoEJB开辟的使用能够和其他JCA资本一样轻松的公布到JAVAEE使用服务器上。
- JNDI
别的一种体例是将kodo.persistence.EntityManagerFactoryImpl的一个实例绑定到JNDI,然后经由过程查找JNDI的体例利用KodoEJB使用。固然这类体例必要开辟者依据分歧的JAVAEE容器编写代码才干完成,可是这类体例可以坚持最年夜限制的JAVAEE容器可移植性,并且为在那些不撑持JCA尺度的JAVAEE容器中利用KodoEJB制造大概。
本文中我们将以经由过程一个复杂的例子,复杂的解说和演示怎样在Weblogic9上经由过程JNDI体例来会见KodoEJB使用。
情况筹办
因为Kodo是基于正文机制的框架,我们必需利用JDK5.0完成开辟事情。以是下载、安装Kodo之前,请确保您已下载和安装了JDK5.0。
为了演示的必要,我们选择MySQL数据库作为耐久化的方针数据库,请人人本人到www.mysql.com下载最新的MySQL数据库后安装。
安装Kodo
Kodo的最新版本是Kodo4.0.0EarlyAccess4,今朝人人能够到http://www.solarmetric.com/往下载试用版本,下载时必要注册,你会失掉30天的License。
将下载的紧缩文件解压到c:/kodo4目次下(前面将利用%KODO_HOME%来援用这个目次),翻开%KODO_HOME%/bin/kodocmd.cmd文件,将个中的KODODIR设置为您的Kodo的安装目次,将JDKHOME设置为Java的安装目次。
安装Weblogic9
KodoEJB在JAVAEE情况下运转时必要EJB容器撑持EJB3尺度,BEA最新公布的Weblogic9服务器就撑持EJB3尺度,因而我们选择Weblogic9作为演示时利用的方针服务器。人人能够到http://www.bea.com下载Weblogic9,然后将Weblogic9安装到本人的呆板上。
[注]本文中的实例是完成可远程会见的EJB实例,因而你能够将Weblogic9安装到其他呆板上,不外客户端挪用的时分必要增添一些情况变量,请参考前面的申明。
开辟KodoEJB使用
因为篇幅的干系,我们间接利用《KodoEJB:切合EJB3标准的耐久层框架》一文中已创立好的例子,包含情况筹办、耐久化类创立、数据库创立等事情,上面的章节中将只管不再反复《KodoEJB:切合EJB3标准的耐久层框架》一文中已提到的步骤,而是重点形貌必要分外完成的事情。
在EJB开辟中,我们一般都接纳SessionFa?ade计划形式,因而上面的例子也利用了这类计划形式来封装KodoEJB使用。
我们利用一个无形态的SessionBean来封装对Book类的一切操纵,因为KodoEJB使用中必要开辟者完成kodo.persistence.EntityManagerFactoryImpl的实例到JNDI的绑定,我们把这部合作作访在SessionBean中完成,上面是SessionBean的接口和完成的全体代码,请注重代码中增添的正文,他们有助于您懂得KodoEJB怎样事情的。
BookBean类
上面是BookBean类的源代码,请人人出格注重BookBean类中的setSessionContext办法,个中的代码将
kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI上。
- packageorg.vivianj.kodo.examples.ejb.stateless;importjava.rmi.RemoteException;importjava.util.Collection;importjavax.ejb.EJBException;importjavax.ejb.SessionBean;importjavax.ejb.SessionContext;importjavax.naming.InitialContext;importjavax.naming.NamingException;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.PersistenceContextType;importjavax.persistence.Query;importkodo.persistence.KodoPersistence;importorg.vivianj.kodo.examples.beans.Book;/***BookBean供应SessionBean的完成类*/publicclassBookBeanimplementsSessionBean{protectedSessionContextctx;privateEntityManagerFactoryemf;/***getBookById依据Book对象的id属性查找、前往切合前提的Book对象**@paramid*Book对象的编号*@return编号为id的Book对象*@throwsRemoteException*/publicBookgetBookById(intid)throwsRemoteException{/*取得EJB的实体办理器*/EntityManagerem=emf.createEntityManager(PersistenceContextType.EXTENDED);try{/*入手下手事件*/em.getTransaction().begin();/*处置营业*/Bookbook=em.find(Book.class,id);/*停止事件*/em.getTransaction().commit();returnbook;}finally{/*封闭EJB实体办理器*/em.close();}}/***updateBook更新Book对象的信息**@parambook*必要更新的Book对象*@throwsRemoteException*/publicvoidupdateBook(Bookbook)throwsRemoteException{/*取得EJB的实体办理器*/EntityManagerem=emf.getEntityManager();try{/*入手下手事件*/em.getTransaction().begin();/*处置营业*/em.merge(book);/*停止事件*/em.getTransaction().commit();}finally{/*封闭EJB实体办理器*/em.close();}}/***createBook办法用于耐久化新的Book对象**@parambook*被耐久化的Book对象*@throwsRemoteException*/publicvoidcreateBook(Bookbook)throwsRemoteException{/*取得EJB的实体办理器*/EntityManagerem=emf.getEntityManager();try{/*入手下手事件*/em.getTransaction().begin();/*处置营业*/em.persist(book);/*停止事件*/em.getTransaction().commit();}finally{/*封闭EJB实体办理器*/em.close();}}publicvoiddeleteBook(Bookbook)throwsRemoteException{/*取得EJB的实体办理器*/EntityManagerem=emf.getEntityManager();try{/*入手下手事件*/em.getTransaction().begin();/*处置营业*/Queryq=em.createQuery("deletefromBookcwherec.id=:id");q.setParameter("id",book.id);q.executeUpdate();/*停止事件*/em.getTransaction().commit();}finally{/*封闭EJB实体办理器*/em.close();}}publicCollectiongetBooks(StringqueryString)throwsRemoteException{/*取得EJB的实体办理器*/EntityManagerem=emf.getEntityManager();try{/*入手下手事件*/em.getTransaction().begin();/*处置营业*/ListallBooks=em.createQuery(queryString).getResultList();/*停止事件*/em.getTransaction().commit();returnallBooks;}finally{/*封闭EJB实体办理器*/em.close();}}publicvoidsetSessionContext(SessionContextctx){this.ctx=ctx;try{/*猎取JAVAEE容器高低文情况*/ContextejbContext=newInitialContext();Objecto=null;try{/*依据JNDI查找kodo.persistence.EntityManagerFactoryImpl的实例*/o=ejbContext.lookup("ejb/kodo/emf");}catch(Exceptione){/*假如没有找到,实验将kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI上*/EntityManagerFactoryemfForEjb=Persistence.createEntityManagerFactory(null);ejbContext.bind("ejb/kodo/emf",emfForEjb);}if(o==null){/*假如没有找到,实验再次查找*/emf=(EntityManagerFactory)ejbContext.lookup("ejb/kodo/emf");}else{emf=(EntityManagerFactory)o;}}catch(NamingExceptione){thrownewRuntimeException(e);}}publicvoidejbCreate()throwsRemoteException{}publicvoidejbActivate()throwsEJBException,RemoteException{}publicvoidejbPassivate()throwsEJBException,RemoteException{}publicvoidejbRemove()throwsEJBException,RemoteException{}publicvoidunsetSessionContext(){ctx=null;}}
复制代码 BookHome接口- packageorg.vivianj.kodo.examples.ejb.stateless;importjava.rmi.RemoteException;importjavax.ejb.CreateException;importjavax.ejb.EJBHome;/***BookHome类供应SessionBean的home接口*/publicinterfaceBookHomeextendsEJBHome{publicBookRemotecreate()throwsCreateException,RemoteException;}
复制代码 BookRemote接口- packageorg.vivianj.kodo.examples.ejb.stateless;importjava.rmi.RemoteException;importjava.util.Collection;importjavax.ejb.EJBObject;importorg.vivianj.kodo.examples.beans.Book;/***BookRemote类供应SessionBean的remote接口*/publicinterfaceBookRemoteextendsEJBObject{publicBookgetBookById(intid)throwsRemoteException;publicvoidupdateBook(Bookbook)throwsRemoteException;publicvoidcreateBook(Bookbook)throwsRemoteException;publicvoiddeleteBook(Bookbook)throwsRemoteException;publicCollectiongetBooks(StringqueryString)throwsRemoteException;}
复制代码 编写EJB形貌符文件
为了将该SessionBean公布到Weblogic9中,我们还必要供应两个设置文件:ejb-jar.xml和weblogic-ejb-jar.xml,作者供应的演示实例中,这两个文件的内容以下,开辟者能够依据本人的实践情况举行调剂。
ejb-jar.xml- <?xmlversion="1.0"encoding="UTF-8"?><ejb-jarxmlns="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>SampleKodoEJB</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- <?xmlversion="1.0"?><weblogic-ejb-jarxmlns="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/90http://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>
复制代码 打包部署
基于KodoEJB开辟的EJB打包和一般的EJB打包没有甚么出格,部署历程也没有甚么出格,对照复杂的体例是利用设置工具创立新的域后,将打包好的EJBjar文件间接拷贝到域目次下的autodeploy目次下。
完全地打包部署历程这里不再赘述,假如人人还不是非常熟习,请人人参考WeblogicServer的在线匡助文档http://edocs.bea.com/wls/docs91/index.html。
在这里要给人人先容的是创立Weblogic9域后怎样设置Kodo的两部份内容:
- 安装Kodo
Windows平台下创立Weblogic9域后,能够在该域地点目次下找到bin目次下的setDomainEnv.cmd文件。翻开该文件,在个中找到setPRE_CLASSPATH=这一行,这里假设地jar文件将被到场Weblogic9服务器的启动CLASSPATH中,因而我们把%KODO_HOME%/lib目次下一切jar文件增添到PRE_CLASSPATH中。上面是作者的设置情形(没有全体填写完全,请开辟者依据实践情形填写完全)。
setPRE_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文件放在这个变量下。
- 供应Kodo的license
Kodo利用时必要供应License文件,在《KodoEJB:切合EJB3标准的耐久层框架》一文中,我们晓得Kodo的License信息保留在使用的META-INF目次中的kodo.xml文件中,和使用一同利用,但是在JAVAEE情况下,我们是将kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI服务上,这个历程是服务器完成的,将License放在EJB包中其实不能让服务器猎取License的信息,检察Kodo的匡助文档,也没有看到响应的实行指南,不外作者经由测试后发明上面的办法能够完成这部合作作。
- 筹办一个license.jar文件
license.jar中包括META-INF目次,该目次下包括有供应KodoLicense的kodo.xml文件。license.jar文件的布局以下:
- 将该jar文件到场到Weblogic域的CLASSPATH中
请参考后面一步“安装Kodo”的步骤将license.jar文件到场Weblogic域的CLASSPATH中。
测试
如今,启动服务器,编写段复杂的测试代码,看看EJB是不是可以一般入手下手事情,上面这段代码能够用于测试从EJB中查找切合请求的Book对象并打印它的name属性。
- /*供应Weblogic服务器的信息*/Hashtable<String,String>h=newHashtable<String,String>();h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");h.put(Context.PROVIDER_URL,"t3://localhost:7001");/*猎取指定服务器的高低文路径*/Contextctx=newInitialContext(h);/*从JNDI中猎取SessionBean的home接口*/Objecto=ctx.lookup("ejb/kodo/book");BookHomehome=(BookHome)PortableRemoteObject.narrow(o,BookHome.class);/*取得SessionBean的remote接口*/BookRemoteremote=home.create();/*挪用营业办法*/System.out.println(remote.getBookById(1).name);
复制代码 实行客户真个时分,请将%KODO_HOME%/lib目次下的jar文件和Weblogic服务器安装目次下的server/lib/weblogic.jar文件都放在CLASSPATH中。
总结
在EJB3的尺度中,EJB3使用既能够用于JavaSE情况中,同时还能够用于JavaEE情况下利用。KodoEJB中供应了两种分歧的体例撑持在JavaEE情况下利用:JCA和JNDI,个中JCA体例对照复杂,而JNDI体例则可以供应更好的天真性。
在本文中,作者以一个复杂的例子申明了在Weblogic9中怎样将KodoEJB中kodo.persistence.EntityManagerFactoryImpl的实例绑定到JNDI上,经由过程JNDI会见KodoEJB使用中的耐久化类。
参考资本:
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
主要缺点就是:速度比较慢,没有C和C++快 |
|