隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          eclipse + JBoss 5 + EJB3開發(fā)指南(7):實(shí)現(xiàn)Entity Bean的一對一(one-to-one)映射

          本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

          上一篇:eclipse + JBoss 5 + EJB3開發(fā)指南(6):編寫第一個實(shí)體Bean程序

              一對一映射是很常用的。在一般情況下,一個主表通過外鍵和從表形成一對一的關(guān)系。在EJB3中使用@OneToOne注釋來映射。一對一關(guān)系除了使用外鍵進(jìn)行關(guān)聯(lián)外,也可以采用共享主鍵的方式連接兩個表。先看看如下兩個表的結(jié)構(gòu):
          圖1  t_customers

          圖2  t_referees

              t_customers和t_referees表形成了一對一的關(guān)系。t_customers表通過referee_id與t_referees表相連。與t_customers表對應(yīng)的實(shí)體Bean的代碼如下:
          package entity;

          import java.util.Collection;
          import javax.persistence.Entity;
          import javax.persistence.FetchType;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.JoinColumn;
          import javax.persistence.OneToOne;
          import javax.persistence.Table;

          @Entity
          @Table(name 
          = "t_customers")
          public class Customer
          {
              
          private int id;
              
          private String name;
              
          private Referee referee;

              @Id
              @GeneratedValue(strategy 
          = GenerationType.IDENTITY)
              
          public int getId()
              {
                  
          return id;
              }
              
          public void setId(int id)
              {
                  
          this.id = id;
              }

              
          public String getName()
              {
                  
          return name;
              }

              
          public void setName(String name)
              {
                  
          this.name = name;
              }

              @OneToOne

              public Referee getReferee()
              {
                  
          return referee;
              }
              
          public void setReferee(Referee referee)
              {
                  
          this.referee = referee;
              }
          }

              從上面的代碼可以看出,getReferee方法使用了@OneToOne進(jìn)行設(shè)置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認(rèn)的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應(yīng)的實(shí)體Bean代碼:
          package entity;

          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.JoinColumn;
          import javax.persistence.OneToOne;
          import javax.persistence.Table;

          @Entity
          @Table(name
          ="t_referees")
          public class Referee
          {
              
          private int id;
              
          private String name;
              
          private Customer customer;
              @OneToOne(mappedBy
          ="referee")
              
          public Customer getCustomer()
              {
                  
          return customer;
              }

              
          public void setCustomer(Customer customer)
              {
                  
          this.customer = customer;
              }

              @Id
              @GeneratedValue(strategy 
          = GenerationType.IDENTITY)
              
          public int getId()
              {
                  
          return id;
              }
              
          public void setId(int id)
              {
                  
          this.id = id;
              }
              
          public String getName()
              {
                  
          return name;
              }

              
          public void setName(String name)
              {
                  
          this.name = name;
              }
          }

              Referee類使用了customer屬性映射了Customer對象,實(shí)際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。
              我們可以使用下面的代碼進(jìn)行測試:
          System.out.println(em.find(Referee.class, 1).getCustomer().getName());
          Customer customer 
          = new Customer();
          customer.setName(
          "微軟");
          Referee referee 
          = new Referee();
          referee.setName(
          "趙軍");
          em.persist(referee);        
          customer.setReferee(referee);
          em.persist(customer);
              如果要覆蓋默認(rèn)的名鍵名,例如,外鍵名為referee1_id,可以兩種方法使EJB3容器使用新的外鍵:
              1.  修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,并將Referee類中mappedBy屬性的值修改成referee1。
              2.  使用@JoinColumn注釋設(shè)置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:
          @OneToOne
          @JoinColumn(name
          ="referee1_id")
          public Referee getReferee()
          {
              
          return referee;
          }
            
              one-to-one關(guān)系還可以共享主鍵,也就是一個表的主鍵的值依賴于另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依賴于t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。
              在EJB3中使用@PrimaryKeyJoinColumn注釋來實(shí)現(xiàn)主鍵的共享。首先需要修改Customer類的getReferee方法上方的注釋,修改后的代碼如下:
          @OneToOne(cascade=CascadeType.ALL)
          @PrimaryKeyJoinColumn
          public Referee getReferee()
          {
              
          return referee;
          }
              然后要修改Referee類中的getCustomer和getId方法上方的注釋,修改后的代碼如下:
          @OneToOne
          @PrimaryKeyJoinColumn
          public Customer getCustomer()
          {
             
          return customer;
          }

          @Id
          @GeneratedValue(generator 
          = "pkGenerator")
          @GenericGenerator(name 
          = "pkGenerator", strategy = "foreign",
             parameters 
          = @Parameter(name = "property", value = "customer"))
          public int getId()
          {
             
          return id;
          }
              其中@GenericGenerator注釋表示這個id屬性是外鍵,并且依賴于customer屬性對應(yīng)的實(shí)體Bean的id屬性值(主鍵值)。
              另外還要注意一點(diǎn),由于t_referees表的id的自增類型已經(jīng)去掉,而且該值依賴于t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。

          下一篇:eclipse + JBoss 5 + EJB3開發(fā)指南(8):實(shí)現(xiàn)Entity Bean的一對多(one-to-many)映射



          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-06-03 10:51 銀河使者 閱讀(2161) 評論(1)  編輯  收藏 所屬分類: java 原創(chuàng)ejb3JBoss

          評論

          # re: eclipse + JBoss 5 + EJB3開發(fā)指南(7):實(shí)現(xiàn)Entity Bean的一對一(one-to-one)映射  回復(fù)  更多評論   

          學(xué)習(xí),收藏一下
          2009-06-04 18:12 | 樂蜂
          主站蜘蛛池模板: 教育| 新兴县| 台安县| 彝良县| 夏邑县| 疏附县| 长顺县| 九寨沟县| 宾川县| 文登市| 共和县| 镇远县| 体育| 嘉鱼县| 昌宁县| 图们市| 迁西县| 永康市| 新兴县| 长寿区| 博湖县| 乌什县| 类乌齐县| 丹凤县| 安顺市| 沾益县| 蕉岭县| 忻城县| 武汉市| 连江县| 辽阳市| 山东| 扎囊县| 南江县| 利辛县| 梅河口市| 永胜县| 休宁县| 梧州市| 望都县| 百色市|