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