Hibernate 简单使用(六)多对多关联映射(二)
2016-07-17 20:45
495 查看
上一篇讲了一下多对多关联映射~
其实多对多关系可以理解为俩个一对多关系~
实例:
一个学生可以选很多课程,一个课程也可以有好多学生选~这俩个表之间一定要有个桥表来维护它们之间的关系,这个桥表就是学生选课关系,那我们就可以把关系弄成这样,一个学生对应许多选课关系,一个课程也对应许多选课关系,一个选课关系对应一个学生,一个选课关系对应一个课程~这就是俩个一对多关系了~
步骤如下:
1.先把POJO类写出来
Student类:
2.写映射文件来双向维护表的关系~
student.hbm.xml:
3.把映射文件集成到配置文件hibernate.cfg.xml上
模拟几个功能~
(1)学生报名
(2)录入课程
(6)查询选课情况
是不是就得用了这种关系之后功能更加丰富了~其实也要看需求的~
有什么不懂的可以问我,我知无不言~
其实多对多关系可以理解为俩个一对多关系~
实例:
一个学生可以选很多课程,一个课程也可以有好多学生选~这俩个表之间一定要有个桥表来维护它们之间的关系,这个桥表就是学生选课关系,那我们就可以把关系弄成这样,一个学生对应许多选课关系,一个课程也对应许多选课关系,一个选课关系对应一个学生,一个选课关系对应一个课程~这就是俩个一对多关系了~
步骤如下:
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()); }*
是不是就得用了这种关系之后功能更加丰富了~其实也要看需求的~
有什么不懂的可以问我,我知无不言~
相关文章推荐
- 交换机升级排障实例
- sql2008启动代理未将对象应用到实例解决方案
- Ajax教程实例详解
- 初识JQuery 实例一(first)
- JQuery入门基础小实例(1)
- Jquery具体实例介绍AJAX何时用,AJAX应该在什么地方用
- 一个小助手批处理实例代码
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- XStream使用方法总结附实例代码
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- asp.net得到本机数据库实例的两种方法代码
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- C++多继承同名隐藏实例详细介绍