业务需求:既要查询某个学生所在的班级,也要查询一个班级中都有哪些学生
实体:班级类持有学生类的集合引用,学生类持有班级的引用。(省略setter getter方法)
public class Clazz {
private int id;
private String name;
private Set<Student> students;
}
public class Student {
private int id;
private String name;
private Clazz clazz;
}
映射文件:
Student.hbm.xml
<hibernate-mapping package="entity" >
<class name="Student" table="tb_student">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<!—这个标签描述clazz的引用-->
<many-to-one name="clazz" column="classId"class="Clazz" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
Clazz.hbm.xml
<hibernate-mapping package="entity" >
<class name="Clazz" table="tb_calzz">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<!—这个标签描述Student的集合引用-->
<set name="students"inverse="true" cascade="all">
<!--指定外键列名-->
<key column="classId"/>
<!--映射关联类-->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
表结构:
mysql>desc tb_calzz
-> ;
+-------+--------------+------+-----+---------+----------------+
|Field | Type | Null | Key |Default | Extra |
+-------+--------------+------+-----+---------+----------------+
|id | int(11) | NO | PRI | NULL | auto_increment |
|name | varchar(255) | YES | |NULL | |
+-------+--------------+------+-----+---------+----------------+
mysql>desc tb_student;
+---------+--------------+------+-----+---------+----------------+
|Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
|id | int(11) | NO | PRI | NULL | auto_increment |
|name | varchar(255) | YES | |NULL | |
|classId | int(11) | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
测试:
在多的一方维护关系
@org.junit.Test
public void testSave(){
Student s1 = new Student();
Student s2 = new Student();
Clazz c1 = new Clazz();
Clazz c2 = new Clazz();
s1.setName("s1");
s2.setName("s2");
c1.setName("c1");
c2.setName("c2");
s1.setClazz(c1);
s2.setClazz(c2);
Session session = HibernateSessionFactory.getSession();
Transaction tra = session.beginTransaction();
try{
session.save(s1);
session.save(s2);
tra.commit();
}catch(Exception e){
e.printStackTrace();
tra.rollback();
}
}
测试结果:
create table tb_calzz (id integer not nullauto_increment, name varchar(255), primary key (id))
create table tb_student (id integer not nullauto_increment, name varchar(255), classId integer, primary key (id))
alter table tb_student add index FK9007E96A1CD10D00 (classId), add constraint FK9007E96A1CD10D00 foreign key (classId) referencestb_calzz (id)
SchemaUpdate:217 - schema update complete
在一的一方维护关系
@org.junit.Test
public void testSave2(){
Student s1 = new Student();
Student s2 = new Student();
Clazz c1 = new Clazz();
Clazz c2 = new Clazz();
s1.setName("s1");
s2.setName("s2");
c1.setName("c1");
c2.setName("c2");
Set<Student> students = new HashSet<Student>();
students.add(s1);
students.add(s2);
c1.setStudents(students);
c2.setStudents(students);
Session session = HibernateSessionFactory.getSession();
Transaction tra = session.beginTransaction();
try{
session.save(c1);
session.save(c2);
tra.commit();
}catch(Exception e){
e.printStackTrace();
tra.rollback();
}
}
测试结果
create table tb_calzz (id integer not nullauto_increment, name varchar(255), primary key (id))
create table tb_student (id integer not nullauto_increment, name varchar(255), classId integer, primary key (id))
alter table tb_student add index FK9007E96A1CD10D00 (classId), add constraint FK9007E96A1CD10D00 foreign key (classId) referencestb_calzz (id)
schema update complete