您的位置:首页 > 其它

Hibernate 简单使用(六)多对多关联映射(二)

2016-07-17 20:45 495 查看
上一篇讲了一下多对多关联映射~

其实多对多关系可以理解为俩个一对多关系~

实例:

一个学生可以选很多课程,一个课程也可以有好多学生选~这俩个表之间一定要有个桥表来维护它们之间的关系,这个桥表就是学生选课关系,那我们就可以把关系弄成这样,一个学生对应许多选课关系,一个课程也对应许多选课关系,一个选课关系对应一个学生,一个选课关系对应一个课程~这就是俩个一对多关系了~

步骤如下:

1.先把POJO类写出来

Student类:

public class Student {

private Long id;
private String name;
private Integer age;
//一个学生对应多个选课关系
private Set<StuCou>stuCous=new HashSet<StuCou>();
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Long id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}

public Set<StuCou> getStuCous() {
return stuCous;
}
public void setStuCous(Set<StuCou> stuCous) {
this.stuCous = stuCous;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}

}
Course类:

public class Course {

private Long id;
private String name;
private Integer credit;//学分
//一个课程对应多个选课关系
private Set<StuCou>stuCous=new HashSet<StuCou>();
public Course() {
super();
// TODO Auto-generated constructor stub
}
public Course(Long id, String name, Integer credit) {
super();
this.id = id;
this.name = name;
this.credit = credit;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getCredit() {
return credit;
}
public void setCredit(Integer credit) {
this.credit = credit;
}

public Set<StuCou> getStuCous() {
return stuCous;
}
public void setStuCous(Set<StuCou> stuCous) {
this.stuCous = stuCous;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + ", credit=" + credit + "]";
}

}
StuCou类:

//学生选课关系
public class StuCou {

private Long id;
private Double grade;
private String comment;//老师对他的评论

//关系
private Student student;
private Course course;
public StuCou() {
super();
// TODO Auto-generated constructor stub
}
public StuCou(Long id, Double grade, String comment) {
super();
this.id = id;
this.grade = grade;
this.comment = comment;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Double getGrade() {
return grade;
}
public void setGrade(Double grade) {
this.grade = grade;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}

public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
@Override
public String toString() {
return "StuCou [id=" + id + ", grade=" + grade + ", comment=" + comment + "]";
}

}
对比一下上一篇的POJ类,发现多了一个类~但是映射文件会更加清楚

2.写映射文件来双向维护表的关系~

student.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xu.day5.double_one2many">

<class name="Student" table="tb_student2">
<id name="id" column="id">
<generator class="increment" />

</id>
<property name="name" />
<property name="age" />

<!-- 关联映射  -->
<!-- 一对多 -->
<set name="stuCous">
<key column="s_id"/>
<one-to-many class="StuCou" />
</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://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xu.day5.double_one2many">

<class name="Course" table="tb_course2">
<id name="id" column="id">
<generator class="increment" />

</id>
<property name="name" />
<property name="credit" />

<!-- 关联映射  -->
<!-- 一对多 -->
<set name="stuCous" >
<key column="c_id"/>
<one-to-many class="StuCou"/>
</set>
</class>

</hibernate-mapping>
stucou.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xu.day5.double_one2many">

<class name="StuCou" table="tb_student_course2">
<id name="id" column="id">
<generator class="increment" />

</id>
<property name="grade" />
<property name="comment" />
<!-- column="s_id"代表是这个表tb_student_course2的外键 -->
<many-to-one name="student" class="Student" column="s_id"/>
<many-to-one name="course" class="Course" column="c_id"/>
</class>

</hibernate-mapping>
映射文件我就不一一解释含义了,前几篇讲的很清楚~

3.把映射文件集成到配置文件hibernate.cfg.xml上

<mapping resource="com/xu/day5/double_one2many/stucou.hbm.xml" />
<mapping resource="com/xu/day5/double_one2many/student.hbm.xml" />
<mapping resource="com/xu/day5/double_one2many/course.hbm.xml" />
4.最后写个测试类Main类:

模拟几个功能~

(1)学生报名

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessioFactory.getSession();
Transaction tr=session.beginTransaction();
System.out.println(1111111);

//学生报名
Student s1=new Student(null, "张三", 10);
Student s2=new Student(null, "李四", 25);
session.save(s1);
session.save(s2);
tr.commit();

}

}
这个效果图不贴,上一篇已经贴了~

(2)录入课程

Course course1=new Course(null, "Java", 2);
Course course2=new Course(null, "c#", 4);
Course course3=new Course(null, "语文", 3);
session.save(course1);
session.save(course2);
session.save(course3);
(3)登录

String hql="from Student where name=?";
Query query=session.createQuery(hql);
query.setString(0, "张三");
Student student=(Student) query.uniqueResult();
(4)查询选课

String hql2="from Course where name=?";
Query query2=session.createQuery(hql2);
query2.setString(0, "c#");
Course course=(Course) query2.uniqueResult();
(5)选课

StuCou stuCou=new StuCou(null, 80.0, "还不错,一般");
stuCou.setStudent(student);
stuCou.setCourse(course);
session.save(stuCou);




(6)查询选课情况

Set<StuCou>stuCous=student.getStuCous();
for(StuCou stuCou:stuCous){
System.out.println(stuCou.getCourse());
}*


是不是就得用了这种关系之后功能更加丰富了~其实也要看需求的~

有什么不懂的可以问我,我知无不言~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息