posts - 78, comments - 34, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2010-01-20 傳智播客—JPA與EJB

          Posted on 2010-01-20 23:20 長城 閱讀(756) 評論(0)  編輯  收藏

          今天內容為兩個版塊JPAEJB,從學習hibernateUMLJPA。他們都涉及到一個極為重要的細節——類與類、接口與接口或類與接口之間的四類關聯關系。今日上午到下午3點左右內容為JPA中處理這四類關系。我想我應該將他們系統的做一下總結,這項任務就留著后天休息來完成吧!

          近三天的課程內容除了帶給我知識上的獲取和見識的增長,更讓我感覺到一種力量!在學習WEB之前,這些互聯網的東西讓我滿頭霧水,不知所云。但在傳智播客學習到現在,WEB應用中應該沒什么還能讓我滿頭霧水的了,云計算也沒之前那么讓我感到神秘的。帶給我什么力量了?一種駕馭知識的力量!我十分有興與兩位高手租房子,我從他們身上學習到了很多知識。因為我沒讀過本科,所以計算機基礎知識不夠好。偶有時間,看一看計算機組成原理等。通過與同學的交流,我似乎已經能摸清硬件了執行原理,并不復雜。

          通過以前的工作自己掌握的知識、在傳智播客學習到的知識,以及與同事、好友、同學們的相處。我似乎已經感覺到將硬件、桌面應用、WEB應用...融匯貫通的感覺!這感覺讓我充滿力量。

          一、JPA中的關聯關系

          說實在的在學習hibernateUML時,聽著老師講關聯關系一點問題都沒有。但他們在我腦子里沒形成系統的概念。但今天學習JPA的關聯關系,讓我找到了感覺。關系關聯在我腦子里形成系統的概念,指日可待!

          1.一對多單向關聯

          典型的例子是,客戶與訂單這種一對多的關系。在客戶類的orders屬性或getOrders屬性方法上添加注解:

          @OneToMany(fetch=FetchType.EAGER,

             cascade={CascadeType.PERSIST,CascadeType.REMOVE},

             targetEntity=Order.class)

          @OneToMany”表示一對多關聯關系的注解,括號內全是他的屬性。

          fetch=FetchType.EAGER”,強迫左外連接,默認值為“LAZY”。

          cascade={CascadeType.PERSIST,CascadeType.REMOVE}”,設置保存和刪除級聯。

          targetEntity=Order.class”,相當于hibernateclass屬性。

          2.多對一單向關聯

          訂單與客戶的例子。在訂單類的customer屬性或getCustomer屬性方法上添加注解:

          @ManyToOne(cascade={CascadeType.PERSIST})

          @JoinColumn(name="cid")

          @ManyToOne”表示多對一的關聯關系的注解,括號內全是他的屬性。

          cascade={CascadeType.PERSIST}”設置保存級聯。

          @JoinColumn”設置Orders表的外鍵。

          name="cid"”外鍵的名稱。

          3.一對多(多對一)雙向關聯

          在客戶類的orders屬性或getOrders屬性方法上添加注解:

          @OneToMany(mappedBy="customer",

             fetch=FetchType.EAGER,

             cascade={CascadeType.PERSIST,CascadeType.REMOVE},

             targetEntity=Order.class)

          在訂單類的customer屬性或getCustomer屬性方法上添加注解:

          在上面的注解中只“@OneToMany”中多了一個“mappedBy="customer"”屬性,它相當于hibernate的“inverse=false”屬性,不參與對集合的控制。如果不設置“mappedBy”屬性,JPA會為一對多關聯關系設置一個中間表。

          4.一對一關聯

          使用學習hibernate時的例子,用戶包含大文本信息的地址屬性。

          外鍵關聯:

          在用戶表的Addr屬性或getAddr屬性方法上添加注解:

          @ManyToOne(cascade={CascadeType.PERSIST})

          @JoinColumn(name="cid")

          @OneToOne”為一對一關聯關系注解。

          @JoinColumn”設置外鍵。

          name="aid"”外鍵名稱為“aid”。

          unique=true”外鍵唯一性,用戶與地址一一對應。

          在地址表的User屬性或getUser屬性方法上添加注解:

          @OneToOne

          @JoinColumn(name="aid",unique=true)

          @OneToOne”為一對一關聯關系注解。

          mappedBy="addr"”取消對集合的控制權,用User實體來控制外鍵的值。

          主鍵關聯:

          在用戶表的Addr屬性或getAddr屬性方法上添加注解:

          @OneToOne”為一對一關聯關系注解。

          @PrimaryKeyJoinColumn”,設置主鍵關聯列。

          name="userid"”,本實體關聯字段的名稱。

          referencedColumnName="addrid"”,所關聯實體的表中的字段名稱。

          在地址表的User屬性或getUser屬性方法上添加注解:

          @OneToOne(mappedBy="addr")

          @OneToOne”為一對一關聯關系注解。

          mappedBy="addr"”取消對集合的控制權,用User實體來控制外鍵的值。

          5.多對多關聯

          經典的例子,教師與學生多對多關聯關系。

          Teacher實體的stus集合屬性或getStus屬性方法上添加注解:

          @OneToOne

          @PrimaryKeyJoinColumn(name="userid",referencedColumnName="addrid")

          @ManyToMany”設置多對多關聯關系。

          @JoinTable”設置關聯表。

          name="jpa_links"”中間表表名。

          joinColumns=@JoinColumn(name="tid")”設置Teacher實體對應的關聯列。數組類型,可以設置多重主鍵。

          inverseJoinColumns=@JoinColumn(name="sid")”設置Student實體對應的關聯列。數組類型,可以設置多重主鍵。

          Student實體的teas集合屬性或getTeas屬性方法上添加注解:

          @OneToOne(mappedBy="addr")

          @ManyToMany”為多對多關聯關系注解。

          mappedBy="addr"”取消對集合的控制權。

          6.繼承關系

          繼承關系有三種解決方法,我們仍然使用學習hibernate時所使用的例子。一個員工實體(Employee),一個鐘點工子實體(HourlyEmployee)和一個薪水工子實體(SalaryEmployee)。

          1).繼承關系樹對應一張表

          Employee實體類上面添加注解:

          @ManyToMany

          @JoinTable(name="jpa_links",

          joinColumns=@JoinColumn(name="tid"),

          inverseJoinColumns=@JoinColumn(name="sid"))

          @Entity”設置實體。

          @Table(name="jpa_inherit_single_ess")”設置表名。

          @Inheritance(strategy=InheritanceType.SINGLE_TABLE)”設置集成策略為單個表,將整個繼承關系樹保存在一張表中。

          @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)”設置區分器字段名稱和類型。

          @DiscriminatorValue("ee")Employee對應的區分類型值為“ee”。

          HourlyEmployee實體類上面添加注解:

          @ManyToMany(mappedBy="stus")

          @Entity”設置實體。

          @DiscriminatorValue("he")Employee對應的區分類型值為“he”。

          SalaryEmployee實體類上面添加注解:

          @Entity

          @Table(name="jpa_inherit_single_ess")

          @Inheritance(strategy=InheritanceType.SINGLE_TABLE)

          @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)

          @DiscriminatorValue("ee")

          @Entity”設置實體。

          @DiscriminatorValue("se")Employee對應的區分類型值為“se”。

          2).每個類對應一張表,使用外鍵關聯。

          Employee實體類上面添加注解:

          @Entity”設置實體。

          @Table(name="jpa_inherit_join_ees")”設置表名。

          @Inheritance(strategy=InheritanceType.JOINED)”設置集成策略為聯合,為繼承關系樹中每個成員創建一個表,并使用外鍵關聯(父類的主鍵被做為子類的外鍵)。

          HourlyEmployee實體類上面添加注解:

          @Entity

          @DiscriminatorValue("he")

          @Entity”設置實體。

          @Table(name="jpa_inherit_join_hes")”設置表名。

          @PrimaryKeyJoinColumn(name="eeid")”設置外鍵。

          SalaryEmployee實體類上面添加注解:

          @Entity

          @DiscriminatorValue("se")

          @Entity”設置實體。

          @Table(name="jpa_inherit_join_ses")”設置表名。

          @PrimaryKeyJoinColumn(name="eeid")”設置外鍵。

          3).聯合表,每個類單獨一個表,使用union聯合。

          Employee實體類上面添加注解:

          @Entity

          @Table(name="jpa_inherit_join_ees")

          @Inheritance(strategy=InheritanceType.JOINED)

          @Entity”設置實體。

          @Table(name="jpa_inherit_join_ess")”設置表名。

          @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)”設置集成策略為union,為繼承關系樹中的每個成員創建一張表,每個表包含全信息(子類表中包含父類屬性的字段)。

          HourlyEmployee實體類上面添加注解:

          @Entity”設置實體。

          SalaryEmployee實體類上面添加注解:

          @Entity

          @Table(name="jpa_inherit_join_hes")

          @PrimaryKeyJoinColumn(name="eeid")

          @Entity”設置實體。

          二、EJB3簡介

          在本文中將對新的規范進行一個概要性的介紹,包括新增的元數據支持,EJBQL的修改,實體Bean模型訪問bean上下文的新方法和運行時環境等等。作者還討論了EJB在未來要作出的調整以及EJB3.0與其他開發規范之間的關系。

          來自:http://developer.51cto.com/art/200510/6284.htm 

          三、EJB3HelloWorld!”

          我們使用EJB3編寫一個“HelloWorld!”程序:

          一、配置JBOSS服務器

          1.我們使用的是“jboss-4.2.2.GA”。

          2.將“jboss-4.2.2.GA”放置在非中文路徑目錄。、

          3.添加環境變量“JBOSS_HOME”,值為“jboss-4.2.2.GA”所在目錄。

          4.修改JBOSS服務器端口,配置文件為“jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\server.xml”。將其中的8080端口修改為8088端口。

          5.IDE中配置JBOSS服務器,指定JBOSS4.X服務器所在目錄。

          二、EJB組件

          1.創建一個普通Java工程,命名為“EJB3_HW_EJB”。

          2.hibernate3.1目錄下的“jpa”子目錄中的所有jar包導入到工程。

          3.在工程中添加一個接口“cn.itcast.cc.ejb3.ejb.HelloWorld”:

          @Entity

          @Table(name="jpa_inherit_join_ses")

          @PrimaryKeyJoinColumn(name="eeid")

          4.編寫一個“HelloWorld”接口的實現類“cn.itcast.cc.ejb3.ejb.HelloWorldImpl”:

          @Entity

          @Table(name="jpa_inherit_join_ess")

          @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

          @Entity

          5.將工程“EJB3_HW_EJB”導出為“EJB3_HW_EJB.jar”包。

          6.將“EJB3_HW_EJB.jar”拷貝到“JBOSS”的“\server\default\deploy”目錄下,JBOSS服務器會自動部署。

          三、WEB應用

          1.創建一個WEB應用工程,命名為“EJB3_HW_WEB”。

          2.將上邊的EJB組件工程“”添加為WEB應用工程的Required Project。(在“Configure Build Path”中設置)

          3.將“index.jsp”頁面的內容設置為:

          @Entity

          import javax.ejb.Local;

          @Local

          public interface HelloWorld {

          String hello(String str);

          }

          import javax.ejb.Stateless;

          @Stateless

          public class HelloWorldImpl implements HelloWorld {

          public String hello(String str) {

          System.out.println(str);

          return "Hello "+str+" ,welcome to EJB3!";

          }

          }

          4.將工程“EJB3_HW_WEB”導出為“EJB3_HW_WEB.war”包。

          5.將“EJB3_HW_WEB.war”拷貝到“JBOSS”的“\server\default\deploy”目錄下,JBOSS服務器會自動部署。

          四、運行

          1.IDE中啟動JBOSS服務器。

          2.打開瀏覽器。

          3.輸入URLhttp://localhost:8088/EJB3_HW_WEB/index.jsp”。

          4.在輸出容器中輸出:“23:15:51,683 INFO  [STDOUT] changcheng”。

          5.JSP頁面中輸出:“Hello changcheng ,welcome to EJB3! 

          OK,今天的內容到此結束!


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 赤水市| 云阳县| 和静县| 柳河县| 体育| 拉萨市| 呼和浩特市| 蓝山县| 防城港市| 左权县| 昭苏县| 大悟县| 铁岭市| 万荣县| 霍林郭勒市| 桓仁| 泰安市| 营口市| 庆阳市| 平邑县| 娱乐| 名山县| 济宁市| 如皋市| 屯留县| 八宿县| 长汀县| 和平区| 田林县| 铁岭县| 平果县| 漳州市| 灵丘县| 沙坪坝区| 义乌市| 梧州市| 大方县| 定襄县| 襄垣县| 静乐县| 哈密市|