1. 程式人生 > >Hibernate中的一對一,一對多,多對多詳解。

Hibernate中的一對一,一對多,多對多詳解。

1、inverse屬性:是否反轉,預設為false就是不反轉然後就是自己維護兩方的關係,true就是反轉,意思是讓對方維護關係。 作用:提高開發的效率

在一對多中,一的一方可以放棄維護提高效率,多的一方必須要維護,因為外來鍵在多的一方。

在多對多中,維護關係理論上隨便哪方維護都行,必須要指定只有一方維護不然雙方都維護的話,就會在中間表中插入兩條一模一樣的資料,這時候就會發生衝突,但實際開發中要看具體的業務

例:公司要給新來的員工設定角色,這時候就是由員工來維護雙方的關係,因為員工是動態增加或刪除的,而公司的角色一般都不會變

2、cascade屬性: 預設為none不級聯 級聯操作(意思就是哪方設定了,這一方的操作或者狀態都會讓與之關聯的物件同步這個狀態或操作) 作用:節省寫程式碼的行數(寫不寫都沒什麼大關係),建議不要設定,如果業務需求要有的話,最好只用save-update

裡面一共有三個可選值(save-update,delete,all)。

save-update:就是儲存或更新會讓與之關聯的物件同步

delete:刪除會讓與之關聯的物件同步

all:以上兩種的效果合併

(getset方法自己生成)

一對多的配置方法:

用寢室和學生為例(一個寢室可以有多個學生,一個學生只能屬於一個寢室)

Student.java(建立成員變數==》一的一方的引用)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    
private Dorm dorm; }

 

Dorm.java(建立成員變數==》多的一方的集合)

public class Dorm {
    
    private Integer dormId; //主鍵
    
    private Set<Student> students = new HashSet<Student>();
}

 

Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"
> <hibernate-mapping package="com.ahead.pojo"> <class name="Student" table="student"> <id name="sid" column="sid"> <generator class="native"></generator> </id> <property name="studentName" type="java.lang.String"> <column name="student_name"></column> </property> <!-- many-to-one:name=一的一方的屬性名 class=與之關聯的全路徑型別 (上面配了package可以寫類名) column:name=存在資料庫中的外來鍵名 --> <many-to-one name="dorm" class="Dorm"> <column name="dorm_id"></column> </many-to-one> </class> </hibernate-mapping>

 

Dorm.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ahead.pojo">
    <class name="Dorm" table="dorm">
        <id name="dormId" column="dorm_id">
            <generator class="native"></generator>
        </id>
        
        <!-- set:name=集合名稱
            key:column=多的一方引用我的主鍵
            one-to-many:class=哪個物件與我關聯的全路徑類名
                        (上面配了package可以寫類名)
         -->
        <set name="students" >
            <key column="dorm_id">
            </key>
            <one-to-many class="Student"/>
        </set>        
            
    </class>

</hibernate-mapping>

 

執行測試資料庫

一對一的配置方法(其實跟一對多差不多):

用學生和身份證舉例 (一個學生只能有一張身份證,一張身份證只能屬於一個學生):

Student.java(建立環境變數==》對應一的一方的引用)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    //一名學生只有一張身份證
    private IdCard idCard;
}

 

IdCard.java(建立環境變數==》對應一的一方的引用)

public class IdCard {
    
    private Integer id; //主鍵
    
    //一張身份證對應一名學生 有外來鍵的一方
    private Student student;
}

 

Student.hbm.xml(直接在配置檔案配one-to-one就好了)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ahead.pojo">
    <class name="Student" table="student">
        <id name="sid" column="sid">
            <generator class="native"></generator>
        </id>
        <property name="studentName" type="java.lang.String">
            <column name="student_name"></column>
        </property>
        
        <one-to-one name="idCard" class="IdCard"></one-to-one>
        
    </class>

</hibernate-mapping>

 

IdCard.hbm.xml

注意:哪方是有外來鍵的一方,就要當作多對一來進行配置,其中一定要指定unique="true"

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ahead.pojo">
    <class name="IdCard" table="idcard">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        
        <many-to-one name="student" class="Student" unique="true" >
            <column name="sid"></column>
        </many-to-one>
    </class>

</hibernate-mapping>

 

執行測試資料庫:

多對多的配置方法:

以學生和課程做例子(一個學生可以選多門課程,一個課程可以被多名學生選)

理解記憶:先拆分成兩邊一對多分析就好做了

畫圖分析多對多的原理

直接貼程式碼

 

Student.java(建立成員變數==》對應多的一方的集合)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    //多對多,一個學生對應多門課程,一門課程對應多個學生
    private Set<Course> courses = new HashSet<Course>();
}

 

 

Course.java(建立成員變數==》對應多的一方的集合)

public class Course {
    
    private Integer cid; //主鍵
    private String courseName; //課程名稱
    
    //多對多,一門課程對應多個學生,一個學生對應多門課程
    private Set<Student> students = new HashSet<Student>();
}

 

Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ahead.pojo">
    <class name="Student" table="student">
        <id name="sid" column="sid">
            <generator class="native"></generator>
        </id>
        <property name="studentName" type="java.lang.String">
            <column name="student_name"></column>
        </property>
        
        <!-- 多對多關係    是一方的配置另外一方也是一樣的套路就是相反
            name:集合屬性名
            table:中間表名
            key->column:(用一對多的思想來考慮[這裡當作一的一方])中間表的外來鍵,別人引用“我”的主鍵當作外來鍵
            
            class:我與哪個類是多對多關係   這裡寫那個類的全路徑名(上面package寫了所以這裡可以不用寫)
            column:(用多對一的思想[這裡當作多的一方])中間表的外來鍵,我引用別人的主鍵當作外來鍵(與之關聯的實體類的主鍵)
         -->
        <set name="courses" table="stu_middle_cour" inverse="true">
            <key column="sid" >
            </key>
            <many-to-many column="cid" class="Course"></many-to-many>
        </set>
        
    </class>

</hibernate-mapping>

 

Course.hbm.xml

  

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ahead.pojo">
    <class name="Course" table="course">  
        <id name="cid" column="cid">
            <generator class="native"></generator>
        </id>
        <property name="courseName" type="java.lang.String">
            <column name="course_name" ></column>
        </property>
        
        <set name="students" table="stu_middle_cour">
            <key column="cid" />
            <many-to-many column="sid" class="Student"></many-to-many>
        </set>
    </class>

</hibernate-mapping>

 

  

啟動測試

mysql中的表