數(shù)據(jù)庫(kù)表用的是oracle的scott示范賬號(hào)下dept
1 創(chuàng)建一個(gè)EJB工程
1. File > New > Project.
或在Package Explorer 中點(diǎn)右鍵,單擊new,選擇Project
或ctrl+new 選擇 EJB Project
2. 選擇J2EE目錄下 EJB Project
3. 選擇 Next >.
輸入工程名稱,如dept ,單擊finish完成。
2 創(chuàng)建一個(gè)CMP EJB2 Entity Bean
1. 主界面選擇菜單File > New > Other,打開新建向?qū)А?/span>
或在Package Explorer 中點(diǎn)右鍵,單擊new,選擇Other
或ctrl+new 選擇 MyEclipse > ejb>EJB2 Entity Bean
2. 展開MyEclipse > ejb 文件夾,選擇> EJB2 Entity Bean。
3. 選擇Next>,界面如下。這里要注意,package建議用.ejb后綴,因?yàn)?/span>XDoclet工具默認(rèn)ejb bean所在的文件夾以.ejb后綴,接口文件的文件夾以.interface為后綴,為了避免設(shè)置上的麻煩,建議按默認(rèn)情況取名。當(dāng)然你也可以通過(guò)設(shè)置XDoclet屬性改變,詳情請(qǐng)查看幫助文檔。
4. 輸入package : com.entity.cmp.ejb
5. 輸入ejb name: dept
6. 選擇是容器管理事務(wù)(CMP)還是bean自己管理事務(wù)(BMP),這里選擇CMP 2.x。
7. 選擇是遠(yuǎn)程(remote)還是本地(local),還是兩者皆是(both),這里選擇遠(yuǎn)程。
8. 選擇Finish 完成操作,生成Dept.java:
9. 添加自己的代碼:
第一步 添加實(shí)體bean與數(shù)據(jù)庫(kù)表映射字段的讀寫方法
/**
*@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:在每個(gè)方法前加@ejb.interface-methodview-type ="remote"的作用是在自動(dòng)生成remote接口時(shí)生成相應(yīng)的方法,如:
public java.lang.Integer getDeptNo( )
throwsjava.rmi.RemoteException;
publicvoid setDeptNo( java.lang.Integer deptno )
throwsjava.rmi.RemoteException;
你也可以自己手動(dòng)把這些方法加到remote接口里!
注解2:在某個(gè)方法前加@ejb.persistence column-name="loc"的作用是在自動(dòng)生成weblogic-cmp-rdbms-jar.xml和ejb-jar.xml兩個(gè)部署文件時(shí)生成如下紅色代碼部分,你也可以自己手寫紅色代碼部分。
<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屬性和數(shù)據(jù)庫(kù)列的映射-->
<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>應(yīng)一致-->
<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
/**
*用于實(shí)現(xiàn)數(shù)據(jù)持久化(插入數(shù)據(jù)庫(kù))
* @ejb.create-method
**/
public Integer ejbCreate(Integer deptid,String deptName,String deptLoc )
{
setDeptNo(deptid);
setDName(deptName);
setLoc(deptLoc);
returnnull;
}
第三步添加相應(yīng)的參數(shù)相同的ejbPostCreateejbCreate
publicvoid ejbPostCreate(Integer deptid,String deptName,String deptLoc ){ }
3. 用XDoclet自動(dòng)生成接口文件、部署描述文件
3.1. 為工程配置XDoclet
1. 右鍵單擊工程名字,打開工程的properties窗口。
選擇菜單Properties > MyEclipse > XDoclet。
2. 在build選項(xiàng)卡中選擇 Use dynamic build specification 和 jdk1.4.2
3. 單擊Add Standard,選擇Standard EJB。
4. 單擊Standard EJB,展開ejbdoclet樹菜單,取消dataobject,entitycmp,entitypk和valueobject選項(xiàng)如下圖:
5 為服務(wù)器配置XDoclet,該配置是為了自動(dòng)生成weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml文件。
右擊ejbdoclet 選擇 Add 。
我這里用的是weblogic8.1,所以選擇weblogic。
l 設(shè)置屬性destDir = src/META-INF。 (weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml生成位置)
l 設(shè)置屬性datasoruce =你在weblogic中配置的數(shù)據(jù)源jndi名稱。
生成weblogic-cmp-rdbms-jar.xml中的:
<data-source-name>aptechJNDI</data-source-name>
5.3. 運(yùn)行XDoclet生成文件
在工程上右鍵MyEclipse->Run XDoclet
生成前后工程目錄應(yīng)該類似為:
同時(shí)增加了weblogic-ejb-jar.xml,weblogic-cmp-rdbms-jar.xml,和ejb-jar.xml三個(gè)部署文件
生成遠(yuǎn)程接口,home接口和實(shí)用類。
l 注意:DeptHome.java即home接口前有個(gè)紅色的叉,我們需要修改它,把com.entity.cmp.interfaces.DeptPK改成Integer,因?yàn)槲覀兊?/span>bean的主鍵很簡(jiǎn)單就是deptno,在數(shù)據(jù)庫(kù)中是個(gè)number(2)類型的,所以用Integer就可以了,而不用在定義一個(gè)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 >中添加紅色部分,配置事務(wù)屬性
<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. 點(diǎn)擊add,添加部署服務(wù)器weblogic。
Entity Bean編寫到此結(jié)束
編寫客戶端程序
1. 新建一個(gè)java project。
2. 為工程配置classpath
l 右鍵單擊該工程名 > build path > configer builder path > add class folder 選擇
上面創(chuàng)建的ejb工程的classes目錄點(diǎn)擊ok。
或
右擊上面創(chuàng)建的ejb工程的src目錄 > 選擇export(導(dǎo)出)> 選擇jar file >如下圖單擊select the export destination 欄目的browse選擇存儲(chǔ)地址。然后右鍵單擊該工程名 > build path > configer builder path > add external jars 選擇你剛導(dǎo)出的jar文件,加入到classpath
l 然后右鍵單擊該工程名 > build path > configer builder path > add external jars 選擇D:"Program Files"bea"weblogic81"server"lib"weblogic.jar,加入到java class path中
3. 創(chuàng)建一個(gè)class:Client.java
publicclass Client {
protected String serverUrl;
protected String jndiName;
protected DeptHome home;
/**
*構(gòu)造方法:根據(jù)服務(wù)器地址端口和ejb部署的jndiname初始化類域,獲得EJBHome
*@paramurl
*@paramjndiName
*@throwsNamingException
*/
public Client(String url, String jndiName) throws NamingException {
this.jndiName = jndiName;
this.serverUrl = url;
home = lookupHome();
}
/**
*獲得初始化上下文環(huán)境(javax.naming.Context)實(shí)例從服務(wù)器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("我們無(wú)法通過(guò)該地址:"
+ serverUrl
+ "獲得一個(gè)到 WebLogic server 的連接!/"
+ "We were unable to get a connection to the WebLogic server at "
+ serverUrl);
log("請(qǐng)確保該服務(wù)器是啟動(dòng)的。/Please make sure that the server is running.");
throw ne;
}
}
/**
*通過(guò)JNDI服務(wù)查找bean的home接口,并返回/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("客戶端無(wú)法獲得EJBHome。"
+ "請(qǐng)確保你已經(jīng)用"""+ jndiName+"""這個(gè)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("開始客戶端測(cè)試:");
String url = "t3://localhost:7001";
String jndi = "ejb/Dept"; // 來(lái)自weblogic-ejb-jar.xml的<jndi-name>ejb/Dept</jndi-name>
Client client = null;
// 如果給了main參數(shù)則用main方法的參數(shù)
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("成功創(chuàng)建編號(hào)為1的部門!");
log("開始執(zhí)行home.findByPrimaryKey根據(jù)主鍵(部門編號(hào))1執(zhí)行部門查詢!");
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("部門編號(hào)"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();
}
}