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

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

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

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

    eclipse + JBoss 5 + EJB3開(kāi)發(fā)指南(11):實(shí)體Bean的連接策略(JOINED Strategy)

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

    上一篇:eclipse + JBoss 5 + EJB3開(kāi)發(fā)指南(10):通過(guò)繼承實(shí)體Bean,將單個(gè)表映射成多個(gè)表(單表策略,SINGLE_TABLE)

       在上一篇文章中,使用單表策略將一個(gè)表從邏輯上分成了多個(gè)表。但這樣可能會(huì)造成空巢字段,也就是說(shuō),一個(gè)邏輯表只由部分字段組成,而物理的表的很多字段的值就會(huì)為null。為了解決這個(gè)問(wèn)題,可以將t_accounts表物理地分成多個(gè)表。為了與t_accounts表進(jìn)行對(duì)比,新建一個(gè)t_myaccounts表,結(jié)構(gòu)如圖1所示。

    圖1  t_myaccounts表

        從t_myaccounts的結(jié)構(gòu)可以看出,在該表中只包含了t_accounts表的前三個(gè)字段,而后兩個(gè)在邏輯上分到了不同的表,因此,首先要建立兩個(gè)物理表:t_checkingaccount和t_savingsaccount。這兩個(gè)表的結(jié)構(gòu)如下:



    圖2  t_checkingaccount表



    圖3  t_savingsaccount表

        在t_checkingaccount和t_savingsaccount表中都有一個(gè)account_id,這個(gè)account_id的值依賴(lài)于t_myaccounts表中的account_id。
        下面先來(lái)編寫(xiě)與t_myaccounts對(duì)應(yīng)的實(shí)體Bean,代碼如下:
        package entity;

    import javax.persistence.Column;
    import javax.persistence.DiscriminatorColumn;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Inheritance;
    import javax.persistence.InheritanceType;
    import javax.persistence.Table;

    @Entity
    @Table(name
    ="t_myaccounts")
    @Inheritance(strategy
    =InheritanceType.JOINED)
    public class Account
    {
        
    protected String id; 
        
    protected float balance;
        
    protected String type;
        @Id
        @GeneratedValue(strategy
    =GenerationType.IDENTITY)
        @Column(name
    ="account_id")
        
    public String getId()
        {
            
    return id;
        }
        
    public void setId(String id)
        {
            
    this.id = id;
        }
        
    public float getBalance()
        {
            
    return balance;
        }
        
    public void setBalance(float balance)
        {
            
    this.balance = balance;
        }
        @Column(name
    ="account_type")
        
    public String getType()
        {
            
    return type;
        }
        
    public void setType(String type)
        {
            
    this.type = type;
        }
    }

     從上面的代碼可以看出,只使用了@Inheritance對(duì)實(shí)體Bean進(jìn)行注釋。
        下面編寫(xiě)MyCheckingAccountMySavingsAccount類(lèi)的代碼:

    MyCheckingAccount類(lèi)的代碼:

    package entity;

    import javax.persistence.Column;
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.PrimaryKeyJoinColumn;
    import javax.persistence.Table;

    @Entity
    @Table(name
    ="t_checkingaccount")
    //  指定與Account類(lèi)共享的主鍵名
    @PrimaryKeyJoinColumn(name="account_id"
    public class MyCheckingAccount extends Account
    {
        
    private double overdraftLimit;
        
    public MyCheckingAccount()
        {
          
    //  為account_type字段賦默認(rèn)值
            setType("C");
        }
        @Column(name
    ="overdraft_limit")
        
    public double getOverdraftLimit()
        {
            
    return overdraftLimit;
        }

        
    public void setOverdraftLimit(double overdraftLimit)
        {
            
    this.overdraftLimit = overdraftLimit;
        }
    }

    MySavingsAccount類(lèi)的代碼:

    package entity;

    import javax.persistence.Column;
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.PrimaryKeyJoinColumn;
    import javax.persistence.Table;

    @Entity
    @Table(name
    ="t_savingsaccount")
    @PrimaryKeyJoinColumn(name
    ="account_id"
    public class MySavingsAccount extends Account
    {
        
        
    private double interestRate;
        
    public MySavingsAccount()
        {
          
    //  為account_type字段賦默認(rèn)值
            setType("S");
        }
      @Column(name
    ="interest_rate")
        
    public double getInterestRate()
        {
            
    return interestRate;
        }
        
    public void setInterestRate(double interestRate)
        {
            
    this.interestRate = interestRate;
        }    
    }

        在上面的代碼中使用構(gòu)造方法來(lái)初始化了t_myaccounts表的account_type字段的值。 
        可以使用下面的代碼進(jìn)行測(cè)試:

    System.out.println(((MyCheckingAccount)em.createQuery("from MyCheckingAccount where id=12")
        .getSingleResult()).getBalance());
    MyCheckingAccount ca 
    = new MyCheckingAccount();
    ca.setBalance(
    342);
    ca.setOverdraftLimit(
    120);
    em.persist(ca);
    MySavingsAccount sa 
    = new MySavingsAccount();
    sa.setBalance(
    200);
    sa.setInterestRate(
    321);
    em.persist(sa);

    下一篇:eclipse + JBoss 5 + EJB3開(kāi)發(fā)指南(12):使用命名查詢(xún)執(zhí)行JPQL



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

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



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


    新浪微博:http://t.sina.com.cn/androidguy   昵稱(chēng):李寧_Lining

    posted on 2009-06-04 15:31 銀河使者 閱讀(2083) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java 原創(chuàng)ejb3JBoss

    主站蜘蛛池模板: 高h视频在线免费观看| 亚洲国产精品美女久久久久| 日本亚洲国产一区二区三区| 久久影视国产亚洲| 亚洲综合图片小说区热久久| 国产.亚洲.欧洲在线| 国产天堂亚洲精品| 日韩免费在线视频| 中文字幕乱码免费视频| 国产无遮挡吃胸膜奶免费看视频 | 在线观看免费av网站| 成年女人视频网站免费m| 亚洲中文字幕视频国产| 亚洲国产日韩在线成人蜜芽| 国产精品黄页免费高清在线观看| 久久国产色AV免费看| 亚洲经典在线观看| 最近中文字幕免费mv视频7| 亚洲精品天堂成人片AV在线播放| 国产免费久久精品| 亚洲mv国产精品mv日本mv| 中文字幕免费在线视频| 成年女性特黄午夜视频免费看| 亚洲JIZZJIZZ妇女| vvvv99日韩精品亚洲| 亚洲成人黄色在线| a色毛片免费视频| 又粗又硬又黄又爽的免费视频 | 在线观看www日本免费网站| 亚洲乱码日产精品a级毛片久久| 亚洲av乱码一区二区三区| 女人18毛片水最多免费观看 | 亚洲中文字幕无码一区二区三区 | 成人免费在线观看网站| 最新亚洲人成无码网www电影| 成年在线观看网站免费| 91亚洲导航深夜福利| av永久免费网站在线观看| 亚洲欧洲日产国码无码久久99| 国内成人精品亚洲日本语音 | 亚洲精品乱码久久久久久蜜桃|