Hibernate5.2之多对多关联关系(六)
Hibernate5.2之多对多关联关系(六)
一.简介
Hibernate中多对多关联关系在工程中使用的频率也是非常高的,例如:大学中学生选课、用户订单等。在本博客中笔者一样通过实例代码为读者阐述Hibernate中的这种关联关系,笔者所采用的是学生选课的案例。
二.数据库的创建
create table courses (
id number(10,0) not null,
cname varchar2(255 char),
primary key (id)
); create table stu_course (
student_id number(10,0) not null,
course_id number(10,0) not null,
primary key (course_id, student_id)
); create table students (
id number(10,0) not null,
name varchar2(255 char),
primary key (id)
);
三.hbm配置文件的方式
3.1 POJO类的创建
public class Student {
private int id;
private String name;
private Set<Course> courses;
//setter and getter
}
public class Course {
private int id;
private String name;
private Set<Student> students;
//setter and getter
}
3.2 hbm文件的创建
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>
<class name="com.demo.hibernate.many2many.Student" table="students">
<id name="id" type="int" column="id">
<generator class="increment"></generator>
</id> <property name="name" type="string" column="name"></property> <set name="courses" table="stu_course">
<key column="student_id"></key>
<many-to-many class="com.demo.hibernate.many2many.Course" column="course_id"></many-to-many>
</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>
<class name="com.demo.hibernate.many2many.Course" table="courses">
<id name="id" type="int" column="id">
<generator class="increment"></generator>
</id> <property name="name" type="string" column="cname"></property> <set name="students" table="stu_course" inverse="true">
<key column="course_id"></key>
<many-to-many class="com.demo.hibernate.many2many.Student" column="student_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
四.注解的方式
Student.java
@Entity
@Table(name="students")
public class Student { @Id
@Column(name="id")
@GenericGenerator(name="incrementGenerator", strategy="increment")
@GeneratedValue(generator="incrementGenerator")
private int id; @Column(name="name")
private String name; @ManyToMany
@JoinTable(name="stu_course",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})
private Set<Course> courses; //setter and getter
}
Course.java
@Entity
@Table(name="courses")
public class Course { @Id
@Column(name="id")
@GenericGenerator(name="incrementGenerator", strategy="increment")
@GeneratedValue(generator="incrementGenerator")
private int id; @Column(name="cname")
private String name; @ManyToMany(mappedBy="courses")
private Set<Student> students; //setter and getter
}
五.代码测试
A.保存
@Test
public void save(){
Transaction tx = session.beginTransaction(); Student s1 = new Student();
s1.setName("BBB"); Course c1 = new Course();
c1.setName("音乐"); Set<Student> students = new HashSet<Student>();
Set<Course> courses = new HashSet<Course>(); students.add(s1);
courses.add(c1); s1.setCourses(courses);
c1.setStudents(students); session.save(s1);
session.save(c1); tx.commit();
}
B.更新1
//新开了一门课,然后学生选择了该课程
@Test
public void addCourse(){
Transaction tx = session.beginTransaction();
Student student = session.get(Student.class, 1);
Course c1 = new Course();
c1.setName("音乐"); student.getCourses().add(c1);
session.saveOrUpdate(c1);
session.saveOrUpdate(student);
tx.commit();
}
C.更新2
//新增学生,然后学生选择课程
@Test
public void addStudent(){
Transaction tx = session.beginTransaction();
Student s = new Student();
s.setName("HHH"); Query<Course> query = session.createQuery("from Course where id in :ids", Course.class);
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
query.setParameter("ids", list); Set<Course> courses = new HashSet<Course>(query.getResultList()); s.setCourses(courses);
session.save(s);
tx.commit();
}
D.更新3
//学生改变课程
@Test
public void changeCourse(){
Transaction tx = session.beginTransaction();
Student student = session.get(Student.class, 1); Course course = session.get(Course.class, 2);
Set<Course> courses = new HashSet<Course>();
courses.add(course); student.setCourses(courses); session.update(student);
tx.commit();
}
E.删除
//删除了学生
@Test
public void delete(){
Transaction tx = session.beginTransaction();
Student s = new Student();
s.setId(1); session.delete(s);
tx.commit();
}
Hibernate5.2之多对多关联关系(六)的更多相关文章
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...
- Hibernate-ORM:12.Hibernate中的多对多关联关系
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...
- Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
- 关于Hibernate多对多关联关系的更新问题。
一个账套类Reckoning和账套项目类 AccountItem.这两个类是双向多对多关联关系. Reckoning.hbm.xml文件的配置如下 <set name="account ...
- Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写
这里以一对多关联关系为例.以Country类为一端,Competition类为多端. 一个国家可以有多个赛事,但是一个赛事只能属于一个国家. Country类 public class Country ...
- (转)Hibernate框架基础——多对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...
- Django框架(十)--常用字段、参数、元信息、多对多关联关系
一.ORM字段 # AutoField() int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列 # IntegerField() ...
- mybatis多对多关联关系映射
mybatis多对多关联关系映射 多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性.而这连个实体都需要包含对方的集合类的属性. 例如:订单和商品,一个订单包含多个商品,一个商品又 ...
随机推荐
- 好用的开源爬虫 jsoup
中文Api http://www.open-open.com/jsoup/ 英文Api https://jsoup.org/
- Direct3D 10学习笔记(一)——初始化
本篇将简单整理Direct3D 10的初始化,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电 ...
- c++类的嵌套(1)
在一个类的内部定义另一个类或结构体,我们称之为嵌套类(nested class),或者嵌套类型.之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现 ...
- 文本编辑器的使用(ckeditor/ueditor)
1.下载ckeditor或ueditor 2.编写示例代码 注意:使用ueditor时,需要特殊配置图片路径(图片的配置路径在ueditor/php/config.json文件中) 3.结果 (需要源 ...
- Linux下mysql忘记root密码
一台机器上的MYSQL服务器很久没用了,忘了root密码无法连接.一时情急,网上搜寻办法,解决,记录在此备用. 修改MySQL的登录设置: //不同的版本的Linux配置文件的位置也不一样,以Lin ...
- asp.net MVC控制器中返回JSON格式的数据时提示下载
Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...
- 页码条--字符串拼接--重写HtmlHelper
public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, ...
- php判断post数据是否存在(or 为空)的方法
最近开发的php项目用到了表单 所以需要响应post请求 而在实际使用中 有些请求只需判断是否存在 百度了不少资料 发现都比较繁杂 然后想起了 count()函数 — 计算数组中的单元数目或对象中的 ...
- 华为U8810的用户如何获取ROOT权限详细教程
由于在论坛里看到有人在找这个手机的详细的root教程,所以刷机啦小编在这里整理了一下方便新手来操作,其实这个手机root起来还是蛮简单的,只需要一个root软件就可以了,相当于一键root了,在这里整 ...
- 4-Spark高级数据分析-第四章 用决策树算法预测森林植被
预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...