JPA oneToMany

注意:本文出自“阿飛”的博客 ,如果要轉載本文章,請與作者聯繫!
並註明來源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html

一對多模型(單向)
說明: 一個客戶對應多個地址,通過客戶可以獲得該客戶的多個地址的信息。客戶和地址是一對多的關係,並且客戶與地址是單向關聯的關係

映射策略
# 外鍵關聯:兩個表的關係定義在一個表中;
# 表關聯:兩個表的關係單獨一個表中通過一箇中間表來關聯。

映射策略——外鍵關聯

表結構如下:
   TABLE customer(id int, name varcher, PRIMARY KEY id)
   TABLE address(id int, address_name varcher, zipcode varcher, city varcher, customer_id int, PRIMARY KEY id)

表address中的customer_id爲customer表中的id的值,通過customer_id可以找到相應的customer的記錄。
將表customer映射爲CustomerEO實體,代碼如下:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToMany(casade={CascadeTypeType.ALL})
        @JoinColumn(name="customer_id")
        public Collection<AddressEO> getAddress() {
              return address;

        }
        ....
    }

一對多@OneToMany註解說明:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToMany {
    Class targetEntity() default void.class;
    CascadeType[] cascade() default {};
    FetchType fetch() default EAGER;
    String mappedBy() default "";
}
# targetEntity屬性表示默認關聯的實體類型,默認爲當前標註的實體類;
因爲一對多的實體集合時保存在集合類中,因此必須指明集合類中保存的具體類型:
1)指定集合泛型的具體類型;如public Collection<AddressEO> getAddress() {...
2)指定targetEntity屬性類型;如:@OneToMany(targetEntity=AddressEO.class,casade={CascadeTypeType.ALL})
# cascade屬性表示與此實體一對一關聯的實體的聯級樣式類型。聯級樣式上當對實體進行操作時的策略。
     說明:在定義關係時經常會涉及是否定義Cascade(級聯處理)屬性,擔心造成負面影響.
        ·不定義,則對關係表不會產生任何影響
        ·CascadeType.PERSIST (級聯新建)
        ·CascadeType.REMOVE (級聯刪除)
        ·CascadeType.REFRESH (級聯刷新)
        ·CascadeType.MERGE (級聯更新)中選擇一個或多個。
        ·還有一個選擇是使用CascadeType.ALL ,表示選擇全部四項
# fetch屬性是該實體的加載方式,有兩種:LAZY和EAGER。默認爲惰性加載,一般也建議使用惰性加載。
# mappedBy屬性用於雙向關聯實體時使用。

映射策略——表關聯
在具體的設計中我們也會使用到使用另外單獨的一張表來關聯實體關係。比如customer和address例子中,我們增加一張ref_customer_address表保存以上兩表的關係。
表結構如下:
   TABLE customer(id int, name varcher, PRIMARY KEY id)
   TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)
   TABLE ref_customer_address(customer_id int not null, address_id int not null unique)
將表customer映射爲CustomerEO實體,代碼如下:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToMany(casade={CascadeTypeType.ALL})
        @JoinTable(name="ref_customer_address",
          joinColumn={@JoinColumn(name="customer_id",referencedColumnName="id")},
          inverseJoinColumn={@JoinColumn(name="address_id",referencedColumnName="id")}
       )

        public Collection<AddressEO> getAddress() {
              return address;

        }
        ....
    }

表關聯(@JoinTable)註解說明:
@Target({METHOD, FIELD})
public @interface JoinTable{
    String name() default "";
    String catalog() default "";
    String schema() default "";
    JoinColumn[] joinColumns() default {};
    JoinColumn[] inverseJoinColumns() default {};
    UniqueConstraint[] uniqueConstraints default {};
}
# name屬性爲連接兩個表的表名稱。若不指定,則使用默認的表名稱,格式如下:
      "表名1" + "_" + "表名2"
# joinColumn屬性表示,在保存關係的表中,所保存關聯關係的外鍵的字段,並配合@JoinColumn標記使用;
# inverseJoinColumn屬性與joinColumn類似,它保存的是保存關係的另外一個外鍵字段;
# catalog和schema屬性表示實體指定點目錄名稱或數據庫名稱;
# uniqueConstraints屬性表示該實體所關聯的唯一約束條件,一個實體可以有多個唯一約束條件,默認沒有約束;

注意:@JoinTable不僅能夠定義一對多的關聯,也可以定義多對多表的關聯。


默認關聯
如果使用了表關聯,並且該表又設置了外鍵,則在映射的實體關係時可以使用默認的映射關係設置,舉例如下:
表結構如下:
   TABLE customer(id int, name varcher, PRIMARY KEY id)
   TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)
   TABLE ref_customer_address(customer_id int not null, address_id int not null unique)
   創建customer_id外鍵
     ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_customer FOREIGN KEY (customer_id) REFERENCES customer (id);
   創建address_id外鍵
     ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_address FOREIGN KEY (address_id) REFERENCES address(id);

映射實體CustomerEO的代碼如下:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToMany
        public Collection<AddressEO> getAddress() {
              return address;

        }
        ....
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章