hibernate一对一,一对多和多对多关联的增删查改
先创建四个类
他们之间的关系
Classes类
public class Classes {
private int cid;
private String className;
private Set<Student> students;
}
student类
public class Student {
private int id;
private String studentName;
private IDcard idcard;
private Classes classes;
private Set<Subject> subjects;
public Student(String studentName,
Classes classes) {
//创建student和IDcard一对一
IDcard iDcard = new IDcard();
setIdcard(iDcard);
this.studentName = studentName;
this.classes = classes;
}
}
身份ID类
public class IDcard {
private int id;
private int idnumber;
}
课程类
public class Subject {
private int sid;
private String subName;
private Set<Student> students;
public Subject(String subName) {
super();
this.subName = subName;
}
}
然后是配置对应的hbm.xml
classes.hbm.xml
<hibernate-mapping package="entity">
<!--类名为Classes,表名也为classes-->
<class name="Classes" table="classes">
<!--主键映射,属性名为cid,列名也为cid-->
<id name="cid" column="cid">
<!--根据底层数据库主键自动增长-->
<generator class="increment"/>
</id>
<!--非主键映射,属性和列名一一对应-->
<property name="className" column="className"/>
<!--一对多设置-->
<set name="students" cascade="save-update,delete">
<!--3.2 key的 column表示多的一方外键名 -->
<key column="cid"/>
<!--3.3 one-to-many的class属性表示多的一方类的全限定名 -->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
student.hbm.xml
<hibernate-mapping package="entity">
<!--类名为Student,表名也为student-->
<class name="Student" table="student">
<!--主键映射,属性名为id,列名也为id-->
<id name="id" column="id">
<!--根据底层数据库主键自动增长-->
<generator class="increment"/>
</id>
<!--非主键映射,属性和列名一一对应-->
<property name="studentName" column="studentName"/>
<!--多对多设置-->
<set name="subjects" cascade="save-update,delete">
<!--3.2 key的 column表示当前类在中间表中的外键 -->
<key column="id" />
<!--3.3 many-to-many表示多对多关系
column:表示另一方在中间表中的外键
class:表示另一方类的全限定名
-->
<many-to-many class="Subject" ></many-to-many>
</set>
<!--多对一设置-->
<many-to-one name="idcard" class="IDcard" unique="true" cascade="save-update,delete"/>
<!--一对一设置-->
<many-to-one name="classes" class="Classes" column="cid"/>
</class>
</hibernate-mapping>
IDcard.hbm.xml
<hibernate-mapping package="entity">
<class name="IDcard" table="idcard">
<id name="id" >
<generator class="increment" >
<param name="property" >student</param>
</generator>
</id>
<!--非主键映射,属性和列名一一对应-->
<property name="idnumber" column="idnumber"/>
</class>
</hibernate-mapping>
subject.hbm.xml
<hibernate-mapping package="entity">
<!--类名为Subject,表名也为subject-->
<class name="Subject" table="subject">
<!--主键映射,属性名为sid,列名也为sid-->
<id name="sid" column="sid">
<!--根据底层数据库主键自动增长-->
<generator class="increment"/>
</id>
<!--非主键映射,属性和列名一一对应-->
<property name="subName" column="subName"/>
<!--多对多设置-->
<set name="students">
<!--3.2 key的 column表示当前类在中间表中的外键 -->
<key column="sid"/>
<!--3.3 many-to-many表示多对多关系
column:表示另一方在中间表中的外键
class:表示另一方类的全限定名
-->
<many-to-many class="Student"></many-to-many>
</set>
</class>
</hibernate-mapping>
加载所有映射
<mapping resource="entity/Student.hbm.xml"/>
<mapping resource="entity/IDcard.hbm.xml"/>
<mapping resource="entity/Classes.hbm.xml"/>
<mapping resource="entity/Subject.hbm.xml"/>
开始测试
添加数据:
public static void addmany_to_many(){
//班级
Classes classes = new Classes();
classes.setClassName("软件工程");
//学生
Set<Student> students = new HashSet<Student>();
Student student1 = new Student("Naive1", classes);
Student student2 = new Student("Naive2", classes);
//把student添加到StudentSet
students.add(student1);
students.add(student2);
//把StudentSet添加到classes
classes.setStudents(students);
//科目
Set<Subject> subjects = new HashSet<Subject>();
Subject subject = new Subject("数学");
Subject subject2 = new Subject("语文");
//把subject添加到SubjectSet
subjects.add(subject);
subjects.add(subject2);
//把student放到subject里
subject.setStudents(students);
subject2.setStudents(students);
//把subject放放到到student里
student1.setSubjects(subjects);
student2.setSubjects(subjects);
//得到Session对象
Session session = HibernateSessionFactory.getSession();
//使用Hibernate操作数据库,都要开启事务,得到事务对象
Transaction transaction = session.getTransaction();
try {
//开启事务
transaction.begin();
//把对象添加到数据库中
session.save(classes);
//提交事务
transaction.commit();
System.out.println("添加成功");
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
System.out.println("添加失败");
}finally {
//关闭Session
session.close();
}
}
查询方法:
public static void selectone(){
//得到Session对象
Session session = HibernateSessionFactory.getSession();
try {
//查询数据库
Classes classes = session.get(Classes.class, 1);
System.out.println(classes.getStudents().toString());
System.out.println(classes.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("查询失败");
}finally {
//关闭Session
session.close();
}
}
public static void main(String[] args) {
addmany_to_many();
selectone();
//dalete();
}