1.N-1映射示例:
假設有兩張表,建立主外鍵關聯
員工<--->部門
員工 Domain:
private Integer id;
private String name;
private Department dept;
員工Hibernate配置:
<class name="Student" table="student_db"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"> <param name="native">id_inc</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="60"></column> </property> <!-- conlumn對應外鍵,name爲對象名稱 --> <many-to-one name="dept"> <column name="name_"></column> </many-to-one> </class>
部門Domain:
private Integer id;
private String name;
部門hbm
<class name="Department" table="department_db"> <id name="id" type="java.lang.Integer"> <column name="id"/> <generator class="native"> <param name="native">id_inc</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="60" ></column> </property> </class>
Department dept1 = new Department();
Department dept2 = new Department();
dept1.setName("財務");
dept2.setName("後勤");
Student st1 = new Student();
Student st2 = new Student();
st1.setName("風姿");
st2.setName("導師");
st1.setDept(dept1);
st2.setDept(dept1);
session.save(dept1);
session.save(dept2);
session.save(st1);
session.save(st2);
trans.commit();
2.one-to-many映射
當需要查詢出一個部門中有多少個學生的情況下需要配置:
Department:
private Set<Student> stu;
public Set<Student> getStu() {
return stu;
}
public void setStu(Set<Student> stu) {
this.stu = stu;
}
相應的hbm.xml文件爲:
<!-- 配置onetomany,cascade爲級聯,要保存一個部門的時候同時加載兩個學生 --> <set name="stu" > <key column="dept_id"/> <one-to-many class="Student"/> </set>
測試:
1.
//查詢一個部門中有多少名學生
Department dept1 = (Department) session.get(Department.class, 3);
Set<Student> set = dept1.getStu();
for(Student s:set){
System.out.println("student:"+s.getName());
}
2.
Department department=new Department();
department.setName("業務部門");
Student stu1=new Student();
stu1.setName("順平");
Student stu2=new Student();
stu2.setName("小明");
Set sets=new HashSet<Student>();
sets.add(stu1);
sets.add(stu2);
department.setStu(sets);
session.save(stu1);
session.save(stu2);
session.save(department);
其中在測試的過程中一直出現一個錯誤:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource
後來發現hibernate.config.xml中配置了:
<mapping resource="many2one/Student.hbm.xml" /> <mapping resource="many2one/Department.hbm.xml" /> <mapping resource="one2many/Student.hbm.xml" /> <mapping resource="one2many/Department.hbm.xml" />
可能是名稱相同互相干擾的原因,去掉不相干的一組後可以正常測試!
3.one-to-one主鍵一對一關聯
案例:一個人對應一個身份證
private Integer id;
private String name;
private Idcard idcard;
private Integer id;
private Date date;
private Person person;
採用手動分配主鍵策略
<class name="Person" table="person_db"> <id name="id" type="java.lang.Integer"> <column name="id"/> <generator class="assigned"> <param name="assigned">id_inc</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="60" ></column> </property> <one-to-one name="idcard"></one-to-one> </class>
設置外鍵,從而是Person中的id與Idcard中id保持一致
class name="Idcard" table="idcard_db"> <id name="id" type="java.lang.Integer"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="date" type="java.util.Date"> <column name="date" not-null="true"></column> </property> <one-to-one name="person"/> </class>
測試:
Person p1=new Person();
p1.setId(1);
p1.setName("jk");
Idcard idCard=new Idcard();
idCard.setDate(new Date());
idCard.setPerson(p1);//表示idCard對象是屬於p1這個對象.
session.save(p1);//先保存人
session.save(idCard);
4.one-to-one基於外鍵
這樣設置的話,那麼idcard_db表中就會多一個person的id列
<class name="Idcard" table="idcard_db"> <id name="id" type="java.lang.Integer"> <generator class="assigned"> </generator> </id> <property name="date" type="java.util.Date"> <column name="date" not-null="true"></column> </property> <many-to-one name="person" unique="true"/> </class>
測試:
Person p1=new Person();
p1.setId(1);
p1.setName("jk");
Idcard idCard=new Idcard();
idCard.setId(1234);
idCard.setDate(new Date());
idCard.setPerson(p1);//表示idCard對象是屬於p1這個對象.
session.save(p1);//先保存人
session.save(idCard);
5.many-to-many
這個映射關係一般很難表示,可以拆分爲多對一或者一對多,一對一的組合
例如學生與課程之間的關係爲多對多關係
可以建立一個學生課程表作爲學生表與課程表的中間表
那麼這樣,學生與學生課程表之間就是一對多關係,課程與學生課程表之間也是一對多關係。
學生Domain設計:
private Integer id;
private String name;
private Set<StuCourse> stuCourse;
學生hbm配置,因爲有一個一對多關係,所以要把Set映射到hbm文件中:
<class name="Student" table="student_db"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"> <param name="native">id_inc</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" not-null="true"></column> </property> <set name="stuCourse"> <!-- 用於指定外鍵 --> <key column="student_id"></key> <one-to-many class="StuCourse" /> </set> </class>
private Integer id;
private String name;
private Set<StuCourse> stuCourse;
<class name="Course" table="course_db"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"> <param name="native">id_inc</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="name" not-null="true"></column> </property> <set name="stuCourse"> <!-- 用於指定外鍵 --> <key column="course_id"></key> <one-to-many class="StuCourse" /> </set> </class>
private Integer id;
private Student stu;
private Course course;
private Integer grade;
<class name="StuCourse" table="stucourse_db"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native"> <param name="native">id_inc</param> </generator> </id> <property name="grade" type="java.lang.Integer"> <column name="grade" not-null="true"></column> </property> <many-to-one name="stu" column="student_id" /> <many-to-one name="course" column="course_id" /> </class>注意的是,學生課程表中many-to-one中的column作爲學生和課程表中外鍵來使用。