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(); }
时间: 2024-10-06 06:48:09