四、N—N关联关系
1.1单向N-N的关联
单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的形式存在。
N-N关联必须使用连接表,N-N关联与有连接表的1-N关联非常相似,只需要去掉
由于与1-N关联非常相似,这里就不演示了。
1.2双向N-N的关联
对于双向的N-N关联,我们只需要转换为两个1-N关联模型即可。双向N-N关联两端都需要使用set集合属性,两端都增加对集合属性的访问。双向N-N同样必须使用连接表来建立两个实体之间的关联关系。
以学生、老师为例:下面为两个实体的持久化类:
Student
[java]
public class Student {
private Integer id;
private String name;
private Set
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set
return teachers;
}
public void setTeachers(Set
this.teachers = teachers;
}
}
Teacher
[java]
public class Teacher {
private Integer id;
private String name;
private Set
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set
return students;
}
public void setStudents(Set
this.students = students;
}
}
双向N-N关联的映射文件需要使用
Student.hbm.xml
[html]
Teacher.hbm.xml
[html] view plaincopyprint
双向N-N关联的双边都需要指定连接表的表名,外键列的列名,所以两个
通过下面的操作类来添加两个Student对象和两个Teacher对象
[java]
static void add(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Teacher teacher1 = new Teacher();
teacher1.setName("teacher1");
Teacher teacher2 = new Teacher();
teacher2.setName("teacher2");
Student student1 = new Student();
student1.setName("student1");
Student student2 = new Student();
student2.setName("student2");
//建立两者之间的关系
Set
ss.add(student1);
ss.add(student2);
teacher1.setStudents(ss);
teacher2.setStudents(ss);
session.save(teacher1);
session.save(teacher2);
session.save(student1);
session.save(student2);
tx.commit();
session.close();
}
注意:这里只能由一边建立关联关系,就是说只能由Student对象建立与Teacher对象的关联或者由Teachert对象建立与Student对象的关联。否则将会出现主键重复错误
作者:chenssy