JPA總結——實體關聯映射(一對一@OneToOne)

來源:互聯網
上載者:User
一對一(@OneToOne)

· 單向關聯
# 注釋@OneToOne定義如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToOne {
    Class targetEntity() default void.class;
    CascadeType[] cascade() default {};
    FetchType fetch() default EAGER;
    boolean optional() default true;
    String mappedBy() default "";
}
# targetEntity屬性工作表示預設關聯的實體類型,預設為當前標註的實體類;
#cascade屬性表示與此實體一對一關聯的實體的聯級樣式類型。聯級樣式上當對實體進行操作時的策略。
     說明:在定義關係時經常會涉及是否定義Cascade(級聯處理)屬性,擔心造成負面影響.
        ·不定義,則對關係表不會產生任何影響
        ·CascadeType.PERSIST (級聯建立)
        ·CascadeType.REMOVE (串聯刪除)
        ·CascadeType.REFRESH (級聯重新整理)
        ·CascadeType.MERGE (串聯更新)中選擇一個或多個。
        ·還有一個選擇是使用CascadeType.ALL ,表示選擇全部四項
#fetch屬性是該實體的載入方式,有兩種:LAZY和EAGER。
#optional屬性工作表示關聯的實體是否能夠存在null值。預設為true,表示可以存在null值。如果為false,則要同時配合使用@JoinColumn標記。
#mappedBy  屬性用於雙向關聯實體時,標註在不儲存關係的實體中。

關聯指定列(@JoinColumn)
# @JoinColumn用於注釋表中的欄位,與@Column不同的是它要儲存表與表之間關係的欄位;
#name屬性是用來標記表中對應的欄位的名稱。如果不設定name的值,預設情況下,name的取值規則如下:
       name=關聯的表的名稱 + "_" + 關聯表主鍵的欄位名
# 預設情況下,關聯的實體的主鍵一般用來做外鍵的。如果不想用主鍵作為外鍵,則需要設定referencedColumnName屬性,如:
        @JoinColumn(name="address_id", referencedColumnName="ref_id")
# @JoinColumn可以與@OneToOne、@ManyToOne或@ManyToMany標記同時使用。

一對一單向關聯樣本:
·客戶實體類CustomerEO:
    @Entity
    @Table(name="customer") //主表
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToOne(casade={CascadeTypeType.ALL})
        @JoinColumn(name="address_id")//關聯的表為address表,其主鍵是id

        private AddressEO address;
        ....
    }
·地址薄類AddressEO:
    @Entity
    @Table(name="address")//從表
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;
        ....//在單項關聯中,從表對應的類中不需要引用主表類
    }

· 雙向關聯(Bidirectional)
如上述樣本中,將AddressEO修改如下:
·地址薄類AddressEO:
    @Entity
    @Table(name="address")
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToOne(mappedBy="address")
        privatre CustomerEO customer;
        ....
    }
即可。

*以上所有樣本及關係中表結構如下:
       TABLE customer(id int, name varcher,  address_id int , PRIMARY KEY id)//在customer中多了一個address_id屬性
       TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)

· 主鍵關聯(@PrimaryKeyJoinColumn)//我無法形成主鍵關聯。
#在關聯的兩個實體中直接使用@PrimaryKeyJoinColumn注釋;
# 在上述表結構中需要在customer表中去掉address_id欄位;
樣本:
·客戶實體類CustomerEO:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToOne(casade={CascadeTypeType.ALL})
         @PrimaryKeyJoinColumn
        private AddressEO address;
        ....
    }
·地址薄類AddressEO:
    @Entity
    @Table(name="address")
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
       &

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.