1. 程式人生 > >Hibernate實體關係對映—Annotation

Hibernate實體關係對映—Annotation

Hibernate實體關係對映分為:

    單邊一對一,雙邊一對一;

    單邊一對多,單邊多對一;

    雙邊一對多,雙邊多對一;

    單邊多對多,雙邊多對多;

    以及主鍵相同的單雙邊一對一。下面分別總結這幾種關係對映的註解方法:

1.  單邊一對一和雙邊一對一

    單邊一對一:比如一個學生(Student)有一個學生證(StudentCard),且Student類中有一個StudentCard物件:

@Entity  
@Table(name = "student")  
public class Student {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    private String id;  
   
    private String name;  
   
    @OneToOne(cascade = {CascadeType.ALL})  
    @JoinColumn(name = "student_id", unique = true)  
    private StudentCard stuCard;  
   
    //省略set,get方法,註解本應該放在get方法上,這裡為了方便,放在成員變數上了。  
}  
   
@Entity  
@Table(name = "studentid")  
public class StudentCard {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    private String id;  
   
    private int num;  
} 
    @Table中name屬性表示指定實體對應 的表名,可以不指定。   

    @GeneratedValue表示主鍵自增長型別,有AUTO, TABLE, SEQUENCE, IDENTITY四種方式:

        GenerationType.AUTO:自動方式,根據底層資料庫自動選擇;

        GenerationType.TABLE:使用指定的表來決定主鍵的取值,一般結合@TableGenerator使用;

        GenerationType.SEQUECE:使用Sequece來決定主鍵的取值,適合Oracle、DB2、PostgreSQL、SAP DB等支援Sequence的資料庫,一般結合@SequenceGnerator使用;

        GenerationType.IDENTITY:支援DB2、MySQL、MS SQL Server、Sybase與HypersonicSQL資料庫的identity型別主鍵。

    @OneToOne表示一對一,cascade配置級聯方式,有PERSIST、REMOVE、MERGE、REFRESH等幾種取值,分別表示在儲存、刪除、修改、重新整理Student類時,會自動在資料庫    

    中儲存、刪除、修改、重新整理屬於它的StudentCard物件,ALL則表示所有動作皆級聯。即級聯後可以通過操作Student類來操作StudentCard類。

    雙邊一對一:比如丈夫(Husband)和妻子(Wife),每個類中皆有對方的類物件:

    @Entity  
    public class Husband {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        private String name;  
       
        @OneToOne  
        @JoinColumn(name="wifeId")//wifeId作為外來鍵欄位,關聯wife表中的主鍵  
        private Wife wife;  
    }  
       
    @Entity  
    public class Wife {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        private String name;  
       
        @OneToOne(mappedBy = "wife")//表示已經在Husband類中對wife做了映射了。一般有雙向關聯的都要設定mappedBy   
        private Husband husband;  
    }  

2. 單邊一對多和單邊多對一

    單邊一對多:比如一個組(Group)裡有多個使用者(User),Group類中有儲存User的集合:

    @Entity  
    @Table(name="t_group")//group在sql中是關鍵詞,避免衝突  
    public class Group {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        private String name;  
       
        @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)  
        @JoinColumn(name="groupid")//表示t_user表中有個叫group_id的外來鍵欄位  
        private Set<User> users = new HashSet<User>();  
    }  
       
    @Entity  
    @Table(name="t_user")  
    public class User {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)   
        private int id;  
       
        private String name;  
    }  
    fetch屬性有兩個值:EAGER和LAZY。分別表示即時載入和延遲載入,這是ORM框架引入的概念。

        fetch = FetchType.LAZY表示載入group時不載入user,一般一對多的時候,在一方預設為LAZY,因為如果多方資料太多,會導致大量資料的載入,影響效能  

    單邊多對一:比如一個組(Group)裡有多個使用者(User),User類中有Group類的成員變數:

    @Entity  
    @Table(name="t_group")//group在sql中是關鍵詞,避免衝突  
    public class Group {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        @Column(unique = true)//利用unique約束禁止重複資料  
        private String name;  
    }  
       
    @Entity  
    @Table(name="t_user")  
    public class User {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)   
        private int id;  
       
        private String name;  
       
        @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)  
        @JoinColumn(name = "group_id")  
        private Group group;  
    }  
   fetch = FetchType.EAGER表示載入user時載入group,多對一的時候,預設為EAGER

3. 雙邊一對多、多對一

    比如一個組(Group)裡有多個使用者(User),Group類中有儲存User的集合,User類中有Group類的成員變數:

    @Entity  
    @Table(name="t_group")  
    public class Group {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        private String name;  
       
        @OneToMany(mappedBy = "group")//表示已經在User類中對group做了映射了。一般有雙向關聯的都要設定mappedBy   
        private Set<User> users = new HashSet<User>();  
    }  
       
    @Entity  
    @Table(name="t_user")  
    public class User {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)   
        private int id;  
       
        private String name;  
       
        @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)  
        @JoinColumn(name = "group_id")  
        private Group group;  
    }  
    雙邊關係中,控制權一般交給多方,因此這裡@OneToMany沒有配置資料庫的外來鍵列,而只配置了一個mappyedBy屬性,告訴Hibernate,配置資訊要到Student類中的group屬性中去找。 

4. 單邊多對多和雙邊多對多

    單邊多對多:比如老師(Teacher)有多個(Student),學生也有多個老師,但是隻有Teacher類中有儲存Student類的集合:

    @Entity  
    public class Teacher {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)   
        private int id;  
       
        private String name;      
       
        @ManyToMany  
        @JoinTable(  
            name = "t_s",//第三張中間表名  
            joinColumns = {@JoinColumn(name="teacher_id")},//第三張表中針對本表主鍵欄位名稱  
            inverseJoinColumns = {@JoinColumn(name="student_id")}//第三張表中針對對方(student)表中主鍵名稱  
            )  
        private Set<Student> students = new HashSet<Student>();  
    }  
       
    @Entity  
    public class Student {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)    
        private int id;  
       
        private String name;  
    }  
    雙邊多對多隻要在Student類中新增儲存Teacher類的集合即可,並配有mappedBy屬性。
    @ManyToMany(mappedBy="students")  
    private Set<Teacher> teachers = new HashSet<Teacher>();  

5. 主鍵相同的單邊一對一和雙邊一對一

    由於兩個實體類是一對一的關係,因此可以設定兩個實體類使用相同的主鍵。反過來,具有相同主鍵的實體被視為一對一的關係。

    針對上面一對一關係的例子,通過主鍵相同的方法如下:

    單邊一對一:

    @Entity  
    @Table(name = "student")  
    public class Student {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)   
        private String id;  
       
        private String name;  
       
        @OneToOne(cascade = {CascadeType.ALL})  
        @PrimaryKeyJoinColumn  
        private StudentCard stuCard;  
    }  
       
    @Entity  
    @Table(name = "studentid")  
    public class StudentCard {  
        @Id  
        //這裡不能使用自增長了   
        private String id;  
       
        private int num;  
    }  

    雙邊一對一:

    @Entity  
    public class Husband {  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private int id;  
       
        private String name;  
       
        @OneToOne  
        @PrimaryKeyJoinColumn  
        private Wife wife;  
    }  
       
    @Entity  
    public class Wife {  
        @Id  
        //這裡不能使用自增長了   
        private int id;  
       
        private String name;  
       
        @OneToOne  
        @PrimaryKeyJoinColumn  
        private Husband husband;  
    }  

        要注意的是save Husband和Wife的時候,先session.save(husband),在session.save(wife)之前要先設定wife的id和husband相同,即:wife.setId(husband.getId())  

        以上就是hibernate中實體關係對映的幾種情況。如有錯誤,歡迎留言指正~

_____________________________________________________________________________________________________________________________________________________

-----樂於分享,共同進步!


相關推薦

Hibernate實體關係對映Annotation

Hibernate實體關係對映分為:     單邊一對一,雙邊一對一;     單邊一對多,單邊多對一;     雙邊一對多,雙邊多對一;     單邊多對多,雙邊多對多;     以及主鍵相同的單雙邊一對一。下面分別總結這幾種關係對映的註解方法: 1.  單邊一對一和雙邊

Hibernate實體關係對映:單向主鍵一對一關聯

主鍵單向一對一關聯: 1、被控方的主鍵參照主控方的主鍵來生成 2、對應資料庫表關係為被控方的主鍵同時參照引用主控方的主鍵 3、儲存被控方物件,需要先儲存主控方(不然怎麼從native產生主鍵值,被控方更是獲取不到了) 主控方People public class Peo

Hibernate關係對映的多對一單向關聯、多對一雙向關聯、一對一主鍵關聯、一對一外來鍵關聯、多對多關係關聯

2018-11-10  22:27:02開始寫   下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構:     下圖內容hibernate對映檔案結構介紹   下圖內容hibernate

Hibernate 關聯關係對映配置

Hibernate 關聯關係對映配置 問題背景 一個部門下有多個員工,每個員工只屬於一個部門 員工對部門(多對一) 部門對員工(一對多) 配置關聯關係 實體類 Employee.java publ

hibernate物件關係對映-註解

1.OneToOne關係對映 OneToOne即一對一對映,簡單來說就是一個主表student和一個從表stucreditcard,B表中存在一個外來鍵關聯到student表,這種關聯關係既可以以外來鍵的方式建立也可以是人工維護的關聯關係。 單向一對一關聯(不包括主鍵關聯

hibernate配置關係對映

一對多,多對一 public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; priva

Hibernate學習(五)———— hibernate一對一關係對映詳解

 一、一對一關係的概述       一對一關係看起來簡單,其實也挺複雜的。其中關係就包含了四種,單向雙向和主鍵關聯外來鍵關聯。 什麼意思呢,也就是包含了單向一對一主鍵關聯、雙向一對一主鍵關聯,單向一對一外來鍵關聯,雙向一對一外來鍵關聯, 這四種中,單雙向就不用在說了把,就是看你業務需求來去設定是否

持久化API(JPA)系列(七)實體關係對映(ORM)之單表對映@IdClass

通過以前的文章,我們瞭解到@Table、@Column、@Id實現了單表的對映,並且書劍有一個@Id指定的唯一欄位。有時我們的資料表也許是有多個主鍵聯合組成的,因此對於單表對映的主鍵,還可以進行如下兩種聯合主鍵對映。        

hibernate繼承關係對映方法(一)--共享一張表

對於如下關係: Person.java package com.hust.PO; public class Person { private Integer id; private String name; private Integer

[Hibernate]註解/關係對映以及關係測試用例

基本註解package OneToOneSingle; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; impor

JPA總結——實體關係對映(一對多@OneToMany)

表address中的customer_id為customer表中的id的值,通過customer_id可以找到相應的customer的記錄。將表customer對映為CustomerEO實體,程式碼如下:    @Entity    @Table(name="customer")    public clas

Hibernate關聯關係對映-----單向一對一對映配置

     這裡舉了一夫一妻的例子。實體:package uni.one2one; public class Husband { private int id; private String name; private Wife wife; public Husba

hibernate繼承關係對映方法(三)--每個具體類一張表TPC

TPC:所謂是“每個具體類一張表(table per concrete class)”的意思是:使繼承體系中每一個子類都對應資料庫中的一張表。每一個子類對應的資料庫表都包含了父類的資訊,並且包含了自己獨有的屬性。每個子類對應一張表,而且這個表的資訊是完備的,即包含了所有從父

2、Hibernate 實體對映(兩種形式)

一、註解配置     介紹            @註解配置中,實體類用@Entity註解,用@Table指定對應的資料表,用@Id配置主鍵,用@Column配置普通屬性,用@OneToMany、@ManyToOne、@OneToOne、@ManyToMany配置實體間的關

【EF系列】EntityFrameWork實體關係對映

一、前言       在我們搭建框架的時候,總會建立一個”實體層“,這個實體層中的“實體”是和資料庫中的“表”相對應的。當寫實體層的時候就要我們手動寫很多結構相似的程式碼。非常的繁瑣。為此,小編向大家

Hibernate關聯關係對映-----基於連線表的單向一對多對映

實體:package uni.many2one.jointable; public class Parent { private int id; private String name; private Child child; public Parent() {

Hibernate實體對映檔案demo.hbm.xml 中的的不同屬性含義

1) assigned主鍵由外部程式負責生成,無需Hibernate參與。2) hilo通過hi/lo 演算法實現的主鍵生成機制,需要額外的資料庫表儲存主鍵生成歷史狀態。3) seqhilo與hilo 類似,通過hi/lo 演算法實現的主鍵生成機制,只是主鍵歷史狀態儲存在S

Hibernate關聯關係對映-----基於連線表的單向一對一對映

實體:package uni.one2one.jointable; public class Husband { private int id; private String name; private Wife wife; public Husband() {

JPA實體關係對映

實體關係是指實體與實體之間的關係,從方向上分為單向關聯和雙向關聯,從實體數量上分為一對一、一對多、多對多等。對於任何兩個實體,都要從這兩個方面區分它們之間的關係。 單向關聯是一個實體中引用了另外一個實體,也即通過一個實體可以獲取另一個實體物件的引用;雙向關聯是兩個實體之間

Hibernate關聯關係對映-----基於連線表的單向多對多對映配置

實體:package uni.many2many.jointable; import java.util.HashSet; import java.util.Set; public class Student { private int id; private Str