posts - 0,  comments - 6,  trackbacks - 0
  图改日加上,公司上网速度让人哪个汉阿

数据库表用的是oracle的scott示范帐号下dept
创建一个EJB工程

1.        File > New > Project.

或在Package Explorer 中点右键,单击new,选择Project

ctrl+new 选择 EJB Project

2.        选择J2EE目录下 EJB Project

3.        选择 Next >.

输入工程名称,如dept ,单击finish完成。

2    创建一个CMP EJB2 Entity Bean

1.        主界面选择菜单File > New > Other,打开新建向导。

或在Package Explorer 中点右键,单击new,选择Other

ctrl+new 选择 MyEclipse > ejb>EJB2 Entity Bean

2.        展开MyEclipse > ejb 文件夹,选择> EJB2 Entity Bean

3.        选择Next>,界面如下。这里要注意,package建议用.ejb后缀,因为XDoclet工具默认ejb bean所在的文件夹以.ejb后缀,接口文件的文件夹以.interface为后缀,为了避免设置上的麻烦,建议按默认情况取名。当然你也可以通过设置XDoclet属性改变,详情请查看帮助文档。

4.             输入package : com.entity.cmp.ejb

5.             输入ejb name: dept

6.             选择是容器管理事务(CMP)还是bean自己管理事务(BMP),这里选择CMP 2.x

7.             选择是远程(remote)还是本地(local),还是两者皆是(both),这里选择远程。

8.             选择Finish 完成操作,生成Dept.java:

9.             添加自己的代码:

第一步 添加实体bean与数据库表映射字段的读写方法

    /**

       *@ejb.interface-methodview-type   ="remote"

       *@ejb.persistence      column-name="deptNo"

       */

    publicabstract Integer getDeptNo();

     /**

       *@ejb.interface-methodview-type   ="remote"

       */

    publicabstractvoid setDeptNo(Integer deptno);

   

     /**

       *@ejb.interface-methodview-type   ="remote"

       *@ejb.persistence      column-name="dName"

       */

    publicabstract String getDName();

     

     /**

       *@ejb.interface-methodview-type   ="remote"

       */

    publicabstractvoid setDName(String name);

   

     /**

       *@ejb.interface-methodview-type   ="remote"

       *@ejb.persistence      column-name="loc"

       */

    publicabstract String getLoc();

     /**

       *@ejb.interface-methodview-type   ="remote"

       */

    publicabstractvoid setLoc(String loc) ;

注解1:在每个方法前加@ejb.interface-methodview-type   ="remote"的作用是在自动生成remote接口时生成相应的方法,如:

      public java.lang.Integer getDeptNo( )

      throwsjava.rmi.RemoteException;

      publicvoid setDeptNo( java.lang.Integer deptno )

      throwsjava.rmi.RemoteException;

      你也可以自己手动把这些方法加到remote接口里!

注解2:在某个方法前加@ejb.persistence      column-name="loc"的作用是在自动生成weblogic-cmp-rdbms-jar.xmlejb-jar.xml两个部署文件时生成如下红色代码部分,你也可以自己手写红色代码部分。

<weblogic-rdbms-jar>

   <weblogic-rdbms-bean>

      <ejb-name>Dept</ejb-name>

      <data-source-name></data-source-name>

      <table-name>Dept</table-name>

      <field-map> <!--bean属性和数据库列的映射-->

<cmp-field>deptNo</cmp-field>

         <dbms-column>deptNo</dbms-column>

      </field-map>

      <field-map>

         <cmp-field>dName</cmp-field>

         <dbms-column>dName</dbms-column>

      </field-map>

      <field-map>

         <cmp-field>loc</cmp-field>

         <dbms-column>loc</dbms-column>

      </field-map>

   </weblogic-rdbms-bean>

<weblogic-rdbms-jar>

<ejb-jar >

   <enterprise-beans>

      <entity >

         <description><![CDATA[Description for Dept]]></description>

         <display-name>Name for Dept</display-name>

         <ejb-name>Dept</ejb-name>

         <home>com.entity.cmp.interfaces.DeptHome</home>

         <remote>com.entity.cmp.interfaces.Dept</remote>

         <ejb-class>com.entity.cmp.ejb.Dept</ejb-class>

         <persistence-type>Container</persistence-type>

         <prim-key-class>com.entity.cmp.interfaces.DeptPK

</prim-key-class>

         <reentrant>False</reentrant>

         <cmp-version>2.x</cmp-version>

         <abstract-schema-name>Dept</abstract-schema-name>

         <!--bean属性定义,上面<cmp-field>和这里的<field-name>应一致-->

         <cmp-field >

<description><![CDATA[]]></description>

            <field-name>deptNo</field-name>

         </cmp-field>

         <cmp-field >

            <description><![CDATA[]]></description>

            <field-name>dName</field-name>

         </cmp-field>

         <cmp-field >

            <description><![CDATA[]]></description>

            <field-name>loc</field-name>

         </cmp-field>

      </entity>

</ejb-jar >

</enterprise-beans>

第二步添加自己的 ejbCreate

/**

     *用于实现数据持久化(插入数据库)

     * @ejb.create-method

    **/

   public Integer ejbCreate(Integer deptid,String deptName,String deptLoc )

{

       setDeptNo(deptid);

       setDName(deptName);

       setLoc(deptLoc);

       returnnull;

    }

第三步添加相应的参数相同的ejbPostCreateejbCreate

    publicvoid ejbPostCreate(Integer deptid,String deptName,String deptLoc ){ }

3.     XDoclet自动生成接口文件、部署描述文件

3.1.  为工程配置XDoclet

1.         右键单击工程名字,打开工程的properties窗口。

选择菜单Properties > MyEclipse > XDoclet

2.        build选项卡中选择 Use dynamic build specification jdk1.4.2

3.        单击Add Standard,选择Standard EJB

4.        单击Standard EJB,展开ejbdoclet树菜单,取消dataobjectentitycmpentitypkvalueobject选项如下图:

5   为服务器配置XDoclet,该配置是为了自动生成weblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml文件。

右击ejbdoclet 选择 Add

我这里用的是weblogic8.1,所以选择weblogic

l         设置属性destDir = src/META-INF (weblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml生成位置)

l         设置属性datasoruce =你在weblogic中配置的数据源jndi名称。

生成weblogic-cmp-rdbms-jar.xml中的:

<data-source-name>aptechJNDI</data-source-name>

5.3.  运行XDoclet生成文件

在工程上右键MyEclipse->Run XDoclet

生成前后工程目录应该类似为:

同时增加了weblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml,和ejb-jar.xml三个部署文件

生成远程接口,home接口和实用类。

l         注意:DeptHome.javahome接口前有个红色的叉,我们需要修改它,把com.entity.cmp.interfaces.DeptPK改成Integer,因为我们的bean的主键很简单就是deptno,在数据库中是个number(2)类型的,所以用Integer就可以了,而不用在定义一个com.entity.cmp.interfaces.DeptPK

public com.entity.cmp.interfaces.Dept findByPrimaryKey(com.entity.cmp.interfaces.DeptPK pk)

      throws javax.ejb.FinderException,java.rmi.RemoteException;

l         修改ejb-jar.xml

1.       <entity >添加红色代码部分,指定某列为主键;把<prim-key-class>的值改成java.lang.Integer和主键的类型一致。

<entity >

         <description><![CDATA[Description for Dept]]></description>

         <display-name>Name for Dept</display-name>

         <ejb-name>Dept</ejb-name>

         <home>com.entity.cmp.interfaces.DeptHome</home>

         <remote>com.entity.cmp.interfaces.Dept</remote>

         <ejb-class>com.entity.cmp.ejb.Dept</ejb-class>

         <persistence-type>Container</persistence-type>

         <prim-key-class>java.lang.Integer</prim-key-class>

         <reentrant>False</reentrant>

         <cmp-version>2.x</cmp-version>

         <abstract-schema-name>Dept</abstract-schema-name>

         <cmp-field >

            <description><![CDATA[]]></description>

            <field-name>deptNo</field-name>

         </cmp-field>

         <cmp-field >

            <description><![CDATA[]]></description>

            <field-name>dName</field-name>

         </cmp-field>

         <cmp-field >

            <description><![CDATA[]]></description>

            <field-name>loc</field-name>

         </cmp-field>

         <primkey-field>deptNo</primkey-field>

      </entity>

2.<assembly-descriptor >中添加红色部分,配置事务属性

<assembly-descriptor >

<container-transaction>

      <method>

        <ejb-name>Dept</ejb-name>

        <method-name>*</method-name>

      </method>

      <trans-attribute>Required</trans-attribute>

    </container-transaction>

</assembly-descriptor >

5.4.  部署EJB

1.        MyEclipse >Add and Remove Project Deployments

2.        点击add,添加部署服务器weblogic

Entity Bean编写到此结束

编写客户端程序

1.         新建一个java project

2.         为工程配置classpath

l         右键单击该工程名 > build path > configer builder path > add class folder 选择

上面创建的ejb工程的classes目录点击ok

右击上面创建的ejb工程的src目录选择export(导出)> 选择jar file >如下图单击select the export destination 栏目的browse选择存储地址。然后右键单击该工程名 > build path > configer builder path > add external jars 选择你刚导出的jar文件,加入到classpath

l         然后右键单击该工程名 > build path > configer builder path > add external jars 选择D:"Program Files"bea"weblogic81"server"lib"weblogic.jar,加入到java class path

3.         创建一个classClient.java

publicclass Client {

    protected String serverUrl;

    protected String jndiName;

    protected DeptHome home;

    /**

     *构造方法:根据服务器地址端口和ejb部署的jndiname初始化类域,获得EJBHome

     *@paramurl

     *@paramjndiName

     *@throwsNamingException

     */

    public Client(String url, String jndiName) throws NamingException {

       this.jndiName = jndiName;

       this.serverUrl = url;

       home = lookupHome();

    }

    /**

     *获得初始化上下文环境(javax.naming.Context)实例从服务器JNDItree.

     */

    private Context getInitialContext() throws NamingException {

       try {

           // Get an InitialContext

           Hashtable h = new Hashtable();

           h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");

           h.put(Context.PROVIDER_URL, serverUrl);

           returnnew InitialContext(h);

       } catch (NamingException ne) {

           log("我们无法通过该地址:"

                  + serverUrl

                  + "获得一个到 WebLogic server 的连接!/"

                  + "We were unable to get a connection to the WebLogic server at "

                  + serverUrl);

           log("请确保该服务器是启动的。/Please make sure that the server is running.");

           throw ne;

       }

    }

    /**

     *通过JNDI服务查找beanhome接口,并返回/Lookupthebean'shomeinterfaceusingJNDI.

     */

    private DeptHome lookupHome() throws NamingException {

       Context ctx = getInitialContext();

       try

       {

           Object home = (DeptHome) ctx.lookup(jndiName);

           return (DeptHome) PortableRemoteObject.narrow(home, DeptHome.class);

       } catch (NamingException ne) {

            log("客户端无法获得EJBHome"

                  + "请确保你已经用"""+ jndiName+"""这个JNDI name"

                  + serverUrl

                  + "WebLogic server上部署了此ejb");

            log("The client was unable to lookup the EJBHome. Please make sure " +

                    "that you have deployed the ejb with the JNDI name " +

                    "ejb/DeptHome on the WebLogic server at "+serverUrl);

           throw ne;

       }

    }

   

   

    /**

     *打印日志

     *

     *@params

     */

    privatestaticvoid log(String s) {

       System.out.println(s);

    }

   

   

   

    publicstaticvoid main (String args[])

    {

       log("开始客户端测试:");

      

       String url = "t3://localhost:7001";

       String jndi = "ejb/Dept"// 来自weblogic-ejb-jar.xml<jndi-name>ejb/Dept</jndi-name>

       Client client = null;

        // 如果给了main参数则用main方法的参数

       if(args.length==1)

       {          

          url = args[0];

       }

      

      

       try

       {

          

           client = new Client(url,jndi);

           DeptHome home = client.home;

           log("获得DeptHome");

           PortableRemoteObject.narrow(home.create(new Integer(1),"java","zhengzhou"), Dept.class);

           log("成功创建编号为1的部门!");

           log("开始执行home.findByPrimaryKey根据主键(部门编号)1执行部门查询!");

           Dept dept;

           dept = (Dept) PortableRemoteObject.narrow(home.findByPrimaryKey(new Integer(1)),Dept.class);

           Integer no = dept.getDeptNo();

           String name = dept.getDName();

           String loc = dept.getLoc();

           log("部门编号"t部门名字"t位置");

           log(no +""t"+name +""t"+loc);

          

           log("game over");

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (ClassCastException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (RemoteException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (CreateException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (FinderException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

      

    }

posted on 2008-04-08 19:13 whistler 阅读(2803) 评论(5)  编辑  收藏


FeedBack:
# re: MyEclipse开发EJB之CMP实体bean[未登录]
2008-07-02 17:46 | 张树坤
非常感谢您的这篇文章,最近手头上有一个EJB2.0的项目,需要用到,所以一直在找相关资料,这篇写的相当的详细,谢谢。
另外我还想多问一句?

如何在CMP Bean中定义自己想要实现的业务方法呢。
比如我想查询所有的记录SelectAllDept()方法,应该怎么写
是否要定义@ejb.finder
等。
期待回复。

  回复  更多评论
  
# re: MyEclipse开发EJB之CMP实体bean
2008-11-27 16:45 | fengda2870
网上关于EJB的教程比较少
找了好久才找到
非常感谢您的这篇文章
  回复  更多评论
  
# re: MyEclipse开发EJB之CMP实体bean[未登录]
2009-03-29 02:09 | 111
PortableRemoteObject 从哪来的

InitialContext 从哪来的


能不能写清楚点。


不过还是谢谢了。  回复  更多评论
  
# re: MyEclipse开发EJB之CMP实体bean
2009-03-29 12:28 | 222
开始客户端测试:
javax.naming.CommunicationException [Root exception is java.net.ConnectException: t3://localhost:7001: Destination unreachable; nested exception is:
java.net.ConnectException: Connection refused: connect; No available router to destination]
at weblogic.jndi.internal.ExceptionTranslator.toNamingException(ExceptionTranslator.java:47)
at weblogic.jndi.WLInitialContextFactoryDelegate.toNamingException(WLInitialContextFactoryDelegate.java:651)
at weblogic.jndi.WLInitialContextFactoryDelegate.getInitialContext(WLInitialContextFactoryDelegate.java:320)
at weblogic.jndi.WLInitialContextFactoryDelegate.getInitialContext(WLInitialContextFactoryDelegate.java:253)
at weblogic.jndi.WLInitialContextFactory.getInitialContext(WLInitialContextFactory.java:135)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at Client.getInitialContext(Client.java:38)
at Client.lookupHome(Client.java:62)
at Client.<init>(Client.java:29)
at Client.main(Client.java:110)
Caused by: java.net.ConnectException: t3://localhost:7001: Destination unreachable; nested exception is:
java.net.ConnectException: Connection refused: connect; No available router to destination
at weblogic.rjvm.RJVMFinder.findOrCreate(RJVMFinder.java:200)
at weblogic.rjvm.ServerURL.findOrCreateRJVM(ServerURL.java:125)
at weblogic.jndi.WLInitialContextFactoryDelegate.getInitialContext(WLInitialContextFactoryDelegate.java:310)
... 10 more


classpath里面也加了weblogic.jar的路径

以上问题运行之后出现的,请问该如何解决。  回复  更多评论
  
# re: MyEclipse开发EJB之CMP实体bean
2009-11-10 10:31 | landor
非常好,照着例子,一步一步的做,再参照
http://xdoclet.sourceforge.net/xdoclet/tags/ejb-tags.html#@ejb_persistence__0__1_的说明,很快做了个例子,哈哈  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(2)

我参与的团队

文章档案(22)

搜索

  •  

最新评论