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. 实时控制软件设计 第一次作业 Draw

    #include <iostream> #include <cstring> #include <math.h> #include <Eigen/Dense& ...

  2. string.empty和null的区别

    关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 string str2=null 的区别,这样定义后 ...

  3. Launching the Debugger Automatically

    You can set up your application to start Visual Studio when you launch the application from Windows. ...

  4. PPP 转义字符 编码 和 解码

    #include <stdio.h> #include <string.h> // PPP数据帧每一帧都以标识字符0x7E开始和结束: // 由于标识字符的值是0x7E,因此当 ...

  5. VLOOKUP

    vlookup(查找目标,查找范围, 返回值的列数,精确或模糊查找) 1. 查找目标:查找的内容或者单元格引用. 2. 查找范围: 选定一个查找区域. 注意一: 查找目标一定要在该区域的第一列. 注意 ...

  6. Android硬盘缓存技术DiskLruCache技术笔记

    防止多图OOM的核心解决思路就是使用LruCache技术,但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次,这显然非常耗时.因此Googl ...

  7. 连接linux数据库Oracle时报错ORA-12541: TNS: 无监听程序

    远程服务器的数据库服务未开启,以及监听未打开 连接oracle 启动服务,startup 切换到oracle /bin 目录,cd $ORACLE_HOME/bin 启动监听, lsnrctl sta ...

  8. 关于for、foreach、filter等的一些用法

    通常我们使用得最熟悉的是for循环. 比如对于一组数字的排大小,可以使用冒泡法. var a=[];     for(var d=0;d<5;d++){         var b=window ...

  9. 只需三步 快速完善网站Sitemap

    越来越多的SEOer把优化的重点放在了站内优化上,细心的朋友应该查看一些前辈的robots.txt的时候不难发现,他们的robots中都加 入了一句Sitemap: http://www.dewang ...

  10. java的三大框架(二)---Struts2

    Strtu2框架 1.控制器:ActionServlet充当控制层 2.模型层:由ActionForm及业务JavaBean实现 3.视图:用户的看到并与之交互的界面   由struts标签库和jsp ...