您的位置:首页 > 其它

Hibernate多对多关系映射学习笔记

2011-12-06 10:09 483 查看


Student.java

packagecn.hai.domain;

importjava.util.Set;

publicclassStudent{
privateintid;
privateStringname;
privateSet<Teacher>teachers;//多对多关系一般有一个中间表用于相关联,Hibernate面向对象,更注重于对象关系

publicintgetId(){
returnid;
}

publicvoidsetId(intid){
this.id=id;
}

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
this.name=name;
}

publicSet<Teacher>getTeachers(){
returnteachers;
}

publicvoidsetTeachers(Set<Teacher>teachers){
this.teachers=teachers;
}

}


Teacher.jaca

packagecn.hai.domain;

importjava.util.Set;

publicclassTeacher{
privateintid;
privateStringname;
privateSet<Student>students;

publicintgetId(){
returnid;
}

publicvoidsetId(intid){
this.id=id;
}

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
this.name=name;
}

publicSet<Student>getStudents(){
returnstudents;
}

publicvoidsetStudents(Set<Student>students){
this.students=students;
}

}


Student.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.hai.domain">
<classname="Student">
<idname="id">
<generatorclass="native"/><!--主键,自增长-->
</id>
<propertyname="name"/>
<!--声明中间表teacher_student,声明Teacher表主键teacher_id,声明多对多对应的表Student,声明多对多对应表的主键student_id-->
<setname="teachers"table="teacher_student">
<keycolumn="student_id"/>
<many-to-manyclass="Teacher"column="Teacher_id"/>
</set>
</class>

</hibernate-mapping>


Teacher.hbm.xml

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.hai.domain">
<classname="Teacher">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="students"table="teacher_student">
<keycolumn="teacher_id"/>
<many-to-manyclass="Student"column="student_id"/>
</set>
</class>

</hibernate-mapping>


ManyToManyTest.java

packagecn.hai;

importjava.util.HashSet;
importjava.util.Set;

importorg.hibernate.Session;
importorg.hibernate.Transaction;

importcn.hai.dao.HibernateUtil;
importcn.hai.domain.Student;
importcn.hai.domain.Teacher;

publicclassManyToMany{

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Sessions=null;
Transactiontx=null;
try{
//建立关系
Set<Teacher>ts=newHashSet<Teacher>();
Teachert1=newTeacher();
t1.setName("XiangfGang1");
ts.add(t1);

Teachert2=newTeacher();
t2.setName("ZhengHui1");
ts.add(t2);

Teachert3=newTeacher();
t3.setName("WangJinFeng1");
ts.add(t3);

Set<Student>ss=newHashSet<Student>();
Studentsd1=newStudent();
sd1.setName("ChengHai1");
ss.add(sd1);

Studentsd2=newStudent();
sd2.setName("JiangKui1");
ss.add(sd2);

Studentsd3=newStudent();
sd3.setName("YanJiaYang1");
ss.add(sd3);

t1.setStudents(ss);
t2.setStudents(ss);
t3.setStudents(ss);
//告诉学生有哪些老师,与上面告诉老师有哪些学生任选一种即可
//sd1.setTeachers(ts);
//sd2.setTeachers(ts);
//sd3.setTeachers(ts);

s=HibernateUtil.getSession();
tx=s.beginTransaction();
s.save(t1);
s.save(t2);
s.save(t3);
s.save(sd1);
s.save(sd2);
s.save(sd3);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}

}


//根据Teacher,id查学生的数量,左右连接查询导致效率低,少用
staticvoidquery(intid){
Sessions=null;
Transactiontx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
Teachert=(Teacher)s.get(Teacher.class,id);
System.out.println("students:"+t.getStudents().size());
//Hibernate.initialize(t.getStudents());
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}




mysql

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: