<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    eclipse + JBoss 5 + EJB3開發指南(7):實現Entity Bean的一對一(one-to-one)映射

    本文為原創,如需轉載,請注明作者和出處,謝謝!

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

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

    圖2  t_referees

        t_customers和t_referees表形成了一對一的關系。t_customers表通過referee_id與t_referees表相連。與t_customers表對應的實體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進行設置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應的實體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對象,實際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。
        我們可以使用下面的代碼進行測試:
    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);
        如果要覆蓋默認的名鍵名,例如,外鍵名為referee1_id,可以兩種方法使EJB3容器使用新的外鍵:
        1.  修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,并將Referee類中mappedBy屬性的值修改成referee1。
        2.  使用@JoinColumn注釋設置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:
    @OneToOne
    @JoinColumn(name
    ="referee1_id")
    public Referee getReferee()
    {
        
    return referee;
    }
      
        one-to-one關系還可以共享主鍵,也就是一個表的主鍵的值依賴于另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依賴于t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。
        在EJB3中使用@PrimaryKeyJoinColumn注釋來實現主鍵的共享。首先需要修改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屬性對應的實體Bean的id屬性值(主鍵值)。
        另外還要注意一點,由于t_referees表的id的自增類型已經去掉,而且該值依賴于t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。

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



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

    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 銀河使者 閱讀(2149) 評論(1)  編輯  收藏 所屬分類: java 原創ejb3JBoss

    評論

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

    學習,收藏一下
    2009-06-04 18:12 | 樂蜂
    主站蜘蛛池模板: 亚洲国产日韩在线人成下载| 国产亚洲成AV人片在线观黄桃| 一边摸一边桶一边脱免费视频 | 午夜无码A级毛片免费视频 | 亚洲精品无码AV人在线播放| 亚洲AV无码XXX麻豆艾秋| 女人被免费视频网站| 中文字幕免费在线看| 直接进入免费看黄的网站| 亚洲国产品综合人成综合网站| 亚洲国产一区二区视频网站| 岛国岛国免费V片在线观看| 99999久久久久久亚洲| 日韩精品一区二区亚洲AV观看| 成人毛片18岁女人毛片免费看| a毛片视频免费观看影院| 偷自拍亚洲视频在线观看99| 91亚洲国产成人久久精品| 亚洲国产精品久久久久网站 | 亚洲免费视频一区二区三区| 国产亚洲AV手机在线观看| 亚洲一区二区三区在线视频| 亚洲精品无码你懂的网站| 伊人久久大香线蕉亚洲五月天 | 特级毛片全部免费播放a一级 | 日本最新免费网站| 日本在线高清免费爱做网站| 全免费a级毛片免费看不卡| 日本视频免费在线| yy6080久久亚洲精品| 亚洲VA成无码人在线观看天堂| 2022年亚洲午夜一区二区福利 | 朝桐光亚洲专区在线中文字幕| 久久免费99精品国产自在现线| 久久免费视频观看| 精品国产麻豆免费网站| 亚洲日本一区二区一本一道| 久久久久亚洲Av无码专| 国产亚洲成归v人片在线观看 | 免费无码A片一区二三区| 在线a亚洲v天堂网2019无码|