在表设计中,我们一般都会考虑表与表之间的关系,现在我来介绍一下表与表之间的几种对应关系
many-to-many 多对多 比如一个用户可以有多种角色 一种角色可以对用多个不同的用户
所以角色和用户之间的关系是多对多的关系 一般要用第三张表表示两者对应的关系
one-to-many 一对多 比如一个老师可以对应很多个学生
many-to-one 相反的是多对一
one-to-one 一对一 比如公民和身份证就是一一对应的

Demo实验:学生与课程之间的关系

1.创建StuCourse类和StuCourse.hbm.xml 表示StudentCourse之间的对应关系
 1 package com.ansibee.domain;
2
3 public class StuCourse {
4 private Integer id;
5 private Student student;
6 private Course course;
7 private Integer grade;
8 public Integer getId() {
9 return id;
10 }
11 public void setId(Integer id) {
12 this.id = id;
13 }
14 public Student getStudent() {
15 return student;
16 }
17 public void setStudent(Student student) {
18 this.student = student;
19 }
20 public Course getCourse() {
21 return course;
22 }
23 public void setCourse(Course course) {
24 this.course = course;
25 }
26 public Integer getGrade() {
27 return grade;
28 }
29 public void setGrade(Integer grade) {
30 this.grade = grade;
31 }
32 }

<!--StuCourse.hbm.xml-->

 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <hibernate-mapping package="com.ansibee.domain">
5 <class name="StuCourse" >
6 <id name="id" type="java.lang.Integer">
7 <generator class="increment">
8 <param name="increment">stucourse_inc</param>
9 </generator>
10 </id>
11 <property name="grade" type="java.lang.Integer">
12 <column name="grade" length="3"/>
13 </property>
14 <many-to-one name="course" column="course_id"/>
15 <many-to-one name="student" column="student_id"/>
16 </class>
17 </hibernate-mapping>


2.创建Student类和Student.hbm.xml文件
 1 package com.ansibee.domain;
2
3 import java.util.Set;
4
5 public class Student {
6 private Integer id;
7 private String name;
8 private Set<StuCourse> stuCourses;
9 public Integer getId() {
10 return id;
11 }
12 public void setId(Integer id) {
13 this.id = id;
14 }
15 public String getName() {
16 return name;
17 }
18 public void setName(String name) {
19 this.name = name;
20 }
21 public Set<StuCourse> getStuCourses() {
22 return stuCourses;
23 }
24 public void setStuCourses(Set<StuCourse> stuCourses) {
25 this.stuCourses = stuCourses;
26 }
27 }

<!--Student.hbm.xml-->

 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <hibernate-mapping package="com.ansibee.domain">
5 <class name="Student">
6 <id name="id" type="java.lang.Integer">
7 <generator class="increment">
8 <param name="increment">stu_inc</param>
9 </generator>
10 </id>
11 <property name="name" type="java.lang.String">
12 <column name="name" length="64"/>
13 </property>
14 <!-- 这里我们配置了one-to-many 一个学生可以对应多个选课记录 -->
15 <set name="stuCourses">
16 <key column="student_id"/>
17 <one-to-many class="StuCourse"/>
18 </set>
19 </class>
20 </hibernate-mapping>

 3.创建Course类和Course.hbm.xml文件

 1 package com.ansibee.domain;
2
3 import java.util.Set;
4
5 public class Course {
6 private Integer id;
7 private String name;
8 private Set<StuCourse> stuCourses;
9 public Integer getId() {
10 return id;
11 }
12 public void setId(Integer id) {
13 this.id = id;
14 }
15 public String getName() {
16 return name;
17 }
18 public void setName(String name) {
19 this.name = name;
20 }
21 public Set<StuCourse> getStuCourses() {
22 return stuCourses;
23 }
24 public void setStuCourses(Set<StuCourse> stuCourses) {
25 this.stuCourses = stuCourses;
26 }
27 }

<!--Course.hbm.xml-->

 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <hibernate-mapping package="com.ansibee.domain">
5 <class name="Course">
6 <id name="id" type="java.lang.Integer">
7 <generator class="increment">
8 <param name="increment">course_inc</param>
9 </generator>
10 </id>
11 <property name="name" type="java.lang.String">
12 <column name="name" length="64"/>
13 </property>
14 <!-- 配置one-to-many 表示一门课程可以对应多个选课记录 -->
15 <set name="stuCourses">
16 <key column="course_id"/>
17 <one-to-many class="StuCourse"/>
18 </set>
19 </class>
20 </hibernate-mapping>

4.完成以上步骤就可以创建Hibernate工具类完成CRUD操作

  1 package com.ansibee.util;
2 import java.util.List;
3
4 import org.hibernate.Query;
5 import org.hibernate.Session;
6 import org.hibernate.SessionFactory;
7 import org.hibernate.Transaction;
8 import org.hibernate.cfg.Configuration;
9
10 final public class HibernateUtil {
11 private static SessionFactory sessionFactory=null;
12 //使用线程局部模式
13 private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
14 private HibernateUtil(){};
15 static {
16 sessionFactory=new Configuration().configure().buildSessionFactory();
17 }
18
19 //关闭sessionFactory
20 public static void closeSessionFactory(){
21 sessionFactory.close();
22 }
23
24 //获取全新的全新的session
25 public static Session openSession(){
26 return sessionFactory.openSession();
27 }
28 //获取和线程关联的session
29 public static Session getCurrentSession(){
30
31 Session session=threadLocal.get();
32 //判断是否得到
33 if(session==null){
34 session=sessionFactory.openSession();
35 //把session对象设置到 threadLocal,相当于该session已经和线程绑定
36 threadLocal.set(session);
37 }
38 return session;
39
40 }
41
42 //提供一个统一的查询方法 hql形式 from类 where 条件=?..
43 public static List executeQuery(String hql,String[] parameters){
44
45 Session session = null;
46 List list = null;
47
48 try {
49 session = openSession();
50 Query query = session.createQuery(hql);
51 //先判断是否有参数绑定
52 if(parameters!=null&&parameters.length>0){
53 for(int i=0;i<parameters.length;i++){
54 query.setString(i, parameters[i]);
55 }
56 }
57 list = query.list();
58 } catch (Exception e) {
59 e.printStackTrace();
60 throw new RuntimeException(e.getMessage());
61 }finally{
62 if(session!=null&&session.isOpen()){
63 session.close();
64 }
65 }
66 return list;
67 }
68
69 //提供一个统一的查询方法(带分页)hql形式 from 类 where 条件=?..
70 public static List executeQueryByPage(String hql,String[] parameters,int pageSize,int pageNow){
71
72 Session session = null;
73 List list = null;
74
75 try {
76 session = openSession();
77 Query query = session.createQuery(hql);
78 //先判断是否有参数绑定
79 if(parameters!=null&&parameters.length>0){
80 for(int i=0;i<parameters.length;i++){
81 query.setString(i, parameters[i]);
82 }
83 }
84
85 //分页
86 query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
87
88 list = query.list();
89 } catch (Exception e) {
90 e.printStackTrace();
91 throw new RuntimeException(e.getMessage());
92 }finally{
93 if(session!=null&&session.isOpen()){
94 session.close();
95 }
96 }
97 return list;
98 }
99
100 //统一的添加方法
101 public static void save(Object obj){
102 Session session=null;
103 Transaction ts=null;
104
105 try {
106 session=openSession();
107 ts=session.beginTransaction();
108 session.save(obj);
109 ts.commit();
110 } catch (Exception e) {
111 if(ts!=null){
112 ts.rollback();
113 }
114 throw new RuntimeException(e.getMessage());
115 }finally{
116 if(session!=null&&session.isOpen()){
117 session.close();
118 }
119 }
120 }
121
122 //统一提供一个修改和删除(批量hql)hql"delete update ...??"
123 public static void executeUpdate(String hql,String[] parameters){
124
125 Session session=null;
126 Transaction ts =null;
127 try {
128 session=openSession();
129 ts=session.beginTransaction();
130 Query query=session.createQuery(hql);
131 //先判断是否有参数要绑定
132 if(parameters!=null&&parameters.length>0){
133 for(int i=0;i<parameters.length;i++){
134 query.setString(i, parameters[i]);
135 }
136 }
137 query.executeUpdate();
138 ts.commit();
139 } catch (Exception e) {
140 e.printStackTrace();
141 throw new RuntimeException(e.getMessage());
142 }finally{
143 if(session!=null&&session.isOpen()){
144 session.close();
145 }
146 }
147 }
148 }

5.配置hibernate.cfg.xml

 1 <?xml version='1.0' encoding='UTF-8'?>
2 <!DOCTYPE hibernate-configuration PUBLIC
3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5 <!-- Generated by MyEclipse Hibernate Tools. -->
6 <hibernate-configuration>
7
8 <session-factory>
9 <property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property>
10 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
11 <property name="connection.password">123</property>
12 <property name="connection.username">root</property>
13 <property name="connection.url">jdbc:mysql://localhost:3306/employee</property>
14 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
15 <property name="show_sql">true</property>
16 <!-- 配置让hibernate自动创建关系模型(表) -->
17 <property name="format_sql">false</property>
18 <property name="hbm2ddl.auto">update</property>
19 <mapping resource="com/ansibee/domain/Course.hbm.xml" />
20 <mapping resource="com/ansibee/domain/StuCourse.hbm.xml" />
21 <mapping resource="com/ansibee/domain/Student.hbm.xml" />
22 </session-factory>
23
24 </hibernate-configuration>

6.编写测试类TestMain

 1 package com.ansibee.view;
2
3 import org.hibernate.Session;
4 import org.hibernate.Transaction;
5
6 import com.ansibee.domain.Course;
7 import com.ansibee.domain.StuCourse;
8 import com.ansibee.domain.Student;
9 import com.ansibee.util.HibernateUtil;
10
11 public class TestMain {
12
13 public static void main(String[] args) {
14
15 Session session = null;
16 Transaction ts = null;
17
18 try {
19 // 使用基础模板
20 session = HibernateUtil.getCurrentSession();
21 ts = session.beginTransaction();
22
23 //添加一个学生,一门课程,选课
24 Student stu1 = new Student();
25 stu1.setName("小共");
26
27 Course course = new Course();
28 course.setName("C#");
29
30 StuCourse sc = new StuCourse();
31 sc.setGrade(95);
32 sc.setCourse(course);
33 sc.setStudent(stu1);
34
35 //顺序保存
36 session.save(stu1);
37 session.save(course);
38 session.save(sc);
39
40 ts.commit();
41 } catch (Exception e) {
42 if (ts != null) {
43 ts.rollback();
44 }
45 e.printStackTrace();
46
47 // TODO: handle exception
48 } finally {
49 if (session != null && session.isOpen()) {
50 session.close();
51 }
52 }
53 }
54
55 }

7.测试运行

Hibernate关系映射之many-to-many(多对多)的更多相关文章

  1. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  2. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  3. web进修之—Hibernate 关系映射(3)

    概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...

  4. 【转载】Hibernate关系映射

    1.        单向一对一关联映射(one-to-one): 两个对象之间一对的关系,例如:Person(人)-IdCard(身份证) 有两种策略可以实现一对一的关联映射: *主键关联:即让两个对 ...

  5. Hibernate关系映射时出现的问题

    在学习Hibernate框架的关系映射时,遇到了一个问题: INFO: HHH000422: Disabling contextual LOB creation as connection was n ...

  6. MyBatis框架——关系映射(一对多、多对多、多对一查询)

    关系映射 一.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工 ...

  7. HIbernate学习笔记(五) 关系映射之一对多与多对一

    三.       多对一 –单向 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和 ...

  8. Hibernate关系映射(三) 多对多

    一.使用用户User和Role实现多对多的示例 User.java,实现对Role的引用 package com.lxit.entity; import java.util.HashSet; impo ...

  9. Hibernate关系映射(三) 多对一和一对多

    一.多对一 学生Student和班级Grade实现多对一,多个学生对应一个班级. Student.java实体类,映射了班级的属性. package com.lxit.entity; import j ...

随机推荐

  1. NoSuchMethodError: org.springframework.beans.factory.config.BeanDefinition.getResolvableType

    spring整合Mybatis报错: 解决方法: 检查maven依赖中的spring-jdbc和spring-webmvc是否版本一致 以下均为5.2.0.RELEASE版本 除此之外再检查是否有其他 ...

  2. C语言知识点汇集

    int main() {// int num; int value; = int num,value; '''同时定义多个变量的方法 但是切记只能是同种类型的''' 都是int 或double等其他类 ...

  3. .NET Core开源导入导出库 Magicodes.IE 2.3发布

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  4. Shiro框架--将Shrio的session改成HTTPSession数据

    重写 FormAuthenticationFilter类 的 onLoginSuccess()方法即可 import javax.servlet.ServletRequest; import java ...

  5. python自动保存百度网盘资源,一定要看

    觉得有帮助的别忘了关注一下知识图谱与大数据公众号 开始 在上一文中,我们保存了百度云盘的地址和提取码,但是这种分享链接很容易被屏蔽,最好的做法就是保存资源到自己的网盘,不过采集的链接有上万个,人肉保存 ...

  6. pwnable.kr-cmd2-witeup

    程序清除了环境变量,解决对策是使用绝对地址使用各种命令和文件. 程序的过滤策略更加严格,过滤了/.天哪,使用绝对路径必用/,怎么办咩? 解决办法是使用pwd变量,它会显示当前目录,然而在/目录下执行此 ...

  7. noSql 的应用场景简述

    选型一定要结合实际情况而不是照本宣科,比如: 企业发展之初,明明一个关系型数据库就能搞定且支撑一年的架构,搞一套大而全的技术方案出来 有一些数据条件查询多,更适合使用ElasticSearch做存储降 ...

  8. linux与linux间,互相拷贝文件

    直接使用scp命令 和远程Linux主机 进行文件的拷贝    1.可以将远程Linux系统上的文件拷贝到本地计算机    2.也可以将本地计算机上的文件拷贝到远程Linux系统上. 比如:我们要拷贝 ...

  9. 这里有一份Java程序员的珍藏书单,请您注意查收

    前言 不要因为迷茫,而停止了脚下前进的路.给大家推荐一份Java程序员必看的书单,豆瓣评分都挺不错的,每一本都值得去读,都值得去收藏,加油呀 本文已经收录到github https://github. ...

  10. tensorflow(一):基础

    一.张量 1.张量的概念 在TensorFlow中,所有的数据都通过张量的形式来表示.从功能的角度,张量可以简单理解为多维数组,零阶张量表示标量(scalar),也就是一个数:一阶张量为向量(vect ...