在Hibernate中,有很多的映射,譬如说是一对一、一对多、多对一、多对多关系。当然对于SSH初学者而言,一对多和多对一是比较容易的,而对于一对一,和多对多有时后就会感觉头疼了。
- 一对一,我们直接就可以用<one-to-one/>标签可以解决。
例如:人和用户之间的关系,假设一个人只能有一个用户,一个用户只能被一个人拥有,他们就是一个一对一的关系。
<one-to-one name="person" cascade="sava-update"/>
- 上面只是方法之一,我们也可以变通为,两个多对一,但是的添加一个属性unique="true"
<many-to-one name="person" unique="true" cascade="save-update"/>
/*--------------------------------------------------------------*/
<many-to-one name="user" unique="true" cascade="save-update"/>
- 多对多的使用中间表没有其他的字段,以及转换成两个一对多的情况我在这而就不给与讨论了,我想讨论的是中间表有其他字段的情况。
例如Student类和Course类,他们之间是多对多的情况,而我想在中间表中添加一个成绩记录,这是我们在Hibernate中如何解决了?下面给出例子的整个过程:
Student类:
public class Student {
private int id;
private String name;
private Map courses;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getCourses() {
return courses;
}
public void setCourses(Map courses) {
this.courses = courses;
}
}
Course类:
public class Course {
private int id;
private String name;
private Map students;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getStudents() {
return students;
}
public void setStudents(Map students) {
this.students = students;
}
}
成绩表:
public class Score {
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
Hibernate配置文件:
<hibernate-mapping package="com.org.model">
<class name="Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="s_name" type="string" />
<map name="courses" table="t_score" >
<key column="s_id"/>
<map-key-many-to-many column="c_id" class="Course" />
<composite-element class="Score">
<property name="score"/>
</composite-element>
</map>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.org.model">
<class name="Course" table="t_scourse">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="c_name" />
<map name="students" table="t_score">
<key column="c_id" />
<map-key-many-to-many column="s_id" class="Student" />
<composite-element class="Score">
<parent name="score"/>
</composite-element>
</map>
</class>
</hibernate-mapping>