声明:编程新手,如有错漏,敬请指出。谢谢。
POJO:Student
package com.test;
import java.util.HashSet;
import java.util.Set;
public class Student
{
private int sid;
private String sname;
private String sage;
private Set<Course> course=new HashSet<Course>();
public Student()
{
}
// getter/setter...
}
POJO:Course
package com.test;
import java.util.HashSet;
import java.util.Set;
public class Course
{
private int cid;
private String cname;
private Set<Student> student=new HashSet<Student>();
public Course() {}
//getter/setter...
}
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.Student" table="student" >
<id name="sid" >
<column name="sid" sql-type="int(10)" not-null="true"/>
<generator class="native"/>
</id>
<property name="sname">
<column name="sname"/>
</property>
<property name="sage">
<column name="sage"/>
</property>
<set access="property" name="course"
table="student_course_link" batch-size="10" fetch="select"
lazy="true" cascade="save-update" inverse="true"
>
<key column="sid"/>
<many-to-many class="com.test.Course" column="cid"/>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.Course" table="course" >
<id name="cid" >
<column name="cid" sql-type="int(10)" not-null="true" />
<generator class="native"/>
</id>
<property name="cname">
<column name="cname"/>
</property>
<set access="property" name="student" batch-size="10" fetch="select"
table="student_course_link" lazy="true" cascade="save-update"
inverse="false">
<key column="cid"/>
<many-to-many class="com.test.Student" column="sid"/>
</set>
</class>
</hibernate-mapping>
数据库三个表,student,course,student_course_link(中间表):
DROP TABLE IF EXISTS `java2`.`student`;
CREATE TABLE `java2`.`student` (
`sid` int(10) unsigned NOT NULL auto_increment,
`sname` varchar(16) default NULL,
`sage` varchar(16) default NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `java2`.`course`;
CREATE TABLE `java2`.`course` (
`cid` int(10) unsigned NOT NULL auto_increment,
`cname` varchar(16) default NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `java2`.`student_course_link`;
CREATE TABLE `java2`.`student_course_link` (
`sid` int(10) NOT NULL,
`cid` int(10) NOT NULL,
PRIMARY KEY (`sid`,`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我们需要一个自定义Comparator:
package com.test;
import java.util.Comparator;
public final class HotCourseComparator implements Comparator {
public int compare(Object arg0, Object arg1) {
Course c1=(Course)arg0;
Course c2=(Course)arg1;
return c2.getStudent().size()-c1.getStudent().size(); // 按照选这门课的人数排序。
}
}
测试类:
public class TestManyToMany
{
public void rankCourse() {
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from Course");
List l=query.list();
Collections.sort(l,new HotCourseComparator()); //这里声明使用我们自定义的Comparator
for(int j=0;j<l.size();j++) {
Course c=(Course)l.get(j);
int snum=c.getStudent().size();
System.out.println(c.getCname()+" has "+snum+" students");
}}
public static void main(String[] args)
{
TestManyToMany t = new TestManyToMany();
t.rankCourse();}
}
运行结果:
C# has 4 students
Ruby on Rails has 4 students
PHP has 3 students
JAVA has 2 students
C has 2 students
PL/SQL has 2 students
MATLAB has 2 students
C++ has 1 students
Heskell has 1 students
Python has 1 students