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中的表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM