- 一对多维护关联关系是更新外键,多对多维护关联关系是在中间表中插入记录。
- inverse 不能出现在list中,且inverse属性只会在集合中有,一般的字段没有该属性。
- cascade 是在所有的关联关系中都会有。
——————————————在多对多的关联映射中————————————————————————————————————————————————
Student: id(Integer),name(String),teachers(Set<Teacher>);
Teacher:id(Integer),name(String),students(Set<Student>);
Student.hbm.xml:
<set name="teachers" table="student_teacher">
<key column="student_Id"/>
<many-to-many class="Teacher" column="teacher_Id"/>
</set>
Teacher.hbm.xml:
<set name="students" table="student_teacher">
<key column="teacher_Id"/>
<many-to-many class="Student" column="student_Id"/>
</set>
多对多的存储:
Teacher t1=new Teacher( );
t1.setName("t1");
Teacher t2=new Teacher( );
t2.setName("t2");
Student s1=new Student( );
s1.setName("s1");
Student s2=new Student( );
s2.setName("s2");
Set<Studnet> students=new HashSet<Student>( );
students.add(s1);
students.add(s2);
Set<Teacher> teachers=new HashSet<Teacher>( );
teachers.add(t1);
teachers.add(t2);
s1.setTeachers(teachers);
s2.setTeachers(teachers);
t1.setStudnets(studnets);
t2.setStudents(students);
save(t1);
save(s1);
在默认情况下,<set>映射中的inverse属性是false,在这里老师和学生都没有放弃维护关联关系的权利,多对多和多对一不同,两端都要维护关系,都将在中间表中插入记录,将报主键重复错误。解决办法,在某一端设置inverse="true",不在关系模型上维护关系,比如将Teacher.hbm.xml 里面的set的inverse属性设置为true,尽管让可以在对象模型上建立从老师到学生的关联关系,但此时在中间表中将只插入一条数据。