映射學習筆記

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>
課程Domain,與學生Domain類似:
	private Integer id;
	private String name;
	private Set<StuCourse> stuCourse;
對應的hbm文件:
	<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作爲學生和課程表中外鍵來使用。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章