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之多对多关联关系(六)的更多相关文章

  1. 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询

    这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...

  2. Hibernate-ORM:12.Hibernate中的多对多关联关系

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...

  3. Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...

  4. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

  5. 关于Hibernate多对多关联关系的更新问题。

    一个账套类Reckoning和账套项目类 AccountItem.这两个类是双向多对多关联关系. Reckoning.hbm.xml文件的配置如下 <set name="account ...

  6. Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写

    这里以一对多关联关系为例.以Country类为一端,Competition类为多端. 一个国家可以有多个赛事,但是一个赛事只能属于一个国家. Country类 public class Country ...

  7. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  8. Django框架(十)--常用字段、参数、元信息、多对多关联关系

    一.ORM字段 # AutoField() int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列 # IntegerField() ...

  9. mybatis多对多关联关系映射

    mybatis多对多关联关系映射 多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性.而这连个实体都需要包含对方的集合类的属性. 例如:订单和商品,一个订单包含多个商品,一个商品又 ...

随机推荐

  1. overflow属性

    css属性overflow属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制. 参数是scroll时候,必会出现滚动条. 参数是auto时候,子 ...

  2. 从零开始学习Node.js例子九 设置HTTP头

    server.js //basic server的配置文件 ; var server = require('./basicserver').createServer(); server.useFavI ...

  3. 10道javascript笔试题

    1.考察this JavaScript var length = 10; function fn() { console.log(this.length); } var obj = { length: ...

  4. eclipse常用插件

    1. eclipse安装主题插件:http://www.eclipsecolorthemes.org/ 2. eclipse terminal插件:在eclipse中集成终端,使用非常方便,不用单独打 ...

  5. 华为U8810的用户如何获取ROOT权限详细教程

    由于在论坛里看到有人在找这个手机的详细的root教程,所以刷机啦小编在这里整理了一下方便新手来操作,其实这个手机root起来还是蛮简单的,只需要一个root软件就可以了,相当于一键root了,在这里整 ...

  6. Weblogic新增域(可以配置新端口)

    操作系统 :Linux version 2.6.32-504.el6.x86_64 Weblogic Server :11g 一.Weblogic新增域(可以配置新端口) 以weblogic用户登录 ...

  7. fine-grained

    鸟类图像分类,CUB-200-2011,可以适用于图片左右的调整.

  8. 杭电acm 1002 大数模板(一)

    从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...

  9. DMA控制器

    DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下: 控制器1: 通道0-3,字节操作, 端口为 00-1F 控制器2: 通道 4 ...

  10. Python 2x -> 3.x

    Nowadays, Python 3 is becoming more and more popular than Python 2, but there are still a lot of cod ...