hibernate中多对多代码实践
创建学生类:Student.java
package manytomany;
import java.util.HashSet;
import java.util.Set;
public class Student {
private Integer id;
private String name;
private String sex;
// 学生可以选择多门课程
private Set<Course> courses = new HashSet<Course>();
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Integer id, String name, String sex, Set<Course> courses) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.courses = courses;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", courses=" + courses + "]";
}
}
创建课程类:Course.java
package manytomany;
import java.util.HashSet;
import java.util.Set;
public class Course {
private Integer id;
private String subjectname;
// 课程可以有多个学生选择
private Set<Student> students = new HashSet<Student>();
public Course() {
super();
// TODO Auto-generated constructor stub
}
public Course(Integer id, String subjectname, Set<Student> students) {
super();
this.id = id;
this.subjectname = subjectname;
this.students = students;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSubjectname() {
return subjectname;
}
public void setSubjectname(String subjectname) {
this.subjectname = subjectname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Course [id=" + id + ", subjectname=" + subjectname + ", students=" + students + "]";
}
}
创建学生配置文件: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>
<!-- name代表的是实体类名 table代表的是数据库表名-->
<class name="manytomany.Student" table="t_stu" catalog="hibernate">
<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 其它属性使用property标签来映射 -->
<property name="name" />
<property name="sex" />
<!-- 设置关系 -->
<!-- 如果在studetn.hbm.xml中设置了inverse=true,s_c中间表由course去维护 -->
<set name="courses" table="s_c">
<key column="sid"></key>
<many-to-many class="manytomany.Course" column="cid"/>
</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>
<!-- name代表的是实体类名 table代表的是数据库表名-->
<class name="manytomany.Course" table="t_course" catalog="hibernate">
<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="subjectname" />
<!-- 设置关系 -->
<set name="students" table="s_c">
<key column="cid"></key>
<many-to-many class="manytomany.Student" column="sid"/>
</set>
</class>
</hibernate-mapping>
核心配置文件hibernate.cfg.xml加入如下代码:
<mapping resource="manytomany/Course.hbm.xml"/>
<mapping resource="manytomany/Student.hbm.xml"/>
编写测试类代码:
@Test
public void Test1() {
Session session = HibernateUtil.getSession();
session.getHibernateFlushMode();
// 操作数据
// 创建学生对象
Student s1 = new Student();
s1.setName("王二麻子");
Student s2 = new Student();
s2.setName("xxxx");
// 创建课程对象
Course c1 = new Course();
c1.setSubjectname("java ee");
Course c2 = new Course();
c2.setSubjectname("JavaScript");
// 创建关联关系
s1.getCourses().add(c1);
s1.getCourses().add(c2);
s2.getCourses().add(c1);
s2.getCourses().add(c2);
c1.getStudents().add(s1);
c1.getStudents().add(s2);
c2.getStudents().add(s1);
c2.getStudents().add(s2);
// 保存
session.save(s1);
session.save(s2);
session.save(c1);
session.save(c2);
session.getTransaction().commit();
session.close();
}
注意:在多对多的关系中,如果在多的某一方添加:inverse=“true”
就可以在多的另一方进行约束。如:
在Student这一方添加:nverse=“true”
<?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>
<!-- name代表的是实体类名 table代表的是数据库表名-->
<class name="manytomany.Student" table="t_stu" catalog="hibernate">
<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 其它属性使用property标签来映射 -->
<property name="name" />
<!-- 设置关系 -->
<!-- 如果在studetn.hbm.xml中设置了inverse=true,s_c中间表由course去维护 -->
<set name="courses" table="s_c" inverse="true">
<key column="sid"></key>
<many-to-many class="manytomany.Course" column="cid"/>
</set>
</class>
</hibernate-mapping>
测试代码修改如下:
@Test
public void test1() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
//操作
//1.创建2个学生
Student s1 = new Student();
s1.setName("zhangsan");
Student s2 = new Student();
s2.setName("wangwu");
//2. 创建2门课
Course c1 = new Course();
c1.setCname("deep learning");
Course c2 = new Course();
c2.setCname("java ee");
//科目来关联学生
c1.getStudents().add(s1);
c1.getStudents().add(s2);
c2.getStudents().add(s1);
c2.getStudents().add(s2);
//保存
session.save(s1);
session.save(s2);
session.save(c1);
session.save(c2);
session.getTransaction().commit();
session.close();
}