上一篇博客以学生类Student和年级类Grade为例介绍了单向多对一映射,我们还以这两个类来看下单向一对多映射,以学生类为多的一端年级类为一的一端。
示例:
学生类Student
public class Student {
private int id;
private String name;
private int age;
//省略get/set方法
}
年级类Grade
public class Grade {
private int id;
private String name;
private Set<Student> students=new HashSet<Student>();
//省略get/set
}
Student.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="age"/>
</class>
</hibernate-mapping>
Grade.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<!-- set是Grade中的集合属性 name属性名称 -->
<set name="students">
<!-- key表示外键 column表示外键列名 -->
<key column="grade_Id" not-null="true"/>
<!-- 一对多 类Grade中students所表示类型 -->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
测试类
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
se.create(true, true);
}
/**
* 保存数据
*/
@Test
public void save(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
Student stu=new Student();
stu.setName("王五");
stu.setAge(20);
Student stu1=new Student();
stu1.setName("李四");
stu1.setAge(20);
//关联
grade.getStudents().add(stu);
grade.getStudents().add(stu1);
//保存数据的顺序是根据外键的配置来决定的
//如果外键不能为null,县保存一的一端
//如果外键可以为null,则可以随意保存
session.save(grade);
session.save(stu);
session.save(stu1);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
/**
* 获取数据
*/
@Test
public void testGet(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=(Grade) session.get(Grade.class, 1);
System.out.println("gradeName="+grade.getName());
System.out.println("grade所对应的多的一端的数据");
Iterator<Student> iter=grade.getStudents().iterator();
while(iter.hasNext()){
Student stu=(Student)iter.next();
System.out.println("学生name="+stu.getName());
}
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
}
执行testCreateDB控制台输出:
执行save控制台打印:
执行testGet控制台打印:
下面来看下双向一对多映射
与上面代码不同的是Student类增加了一个属性如下:
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
//省略get/set方法
}
Student.hbm.xml配置文件也有改动,如下:
<hibernate-mapping package="com.test.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="age"/>
<many-to-one name="grade" class="Grade" column="grade_Id"/>
</class>
</hibernate-mapping>
注意:将Grade.hbm.xml配置文件里key里的not-null="true"去掉,否则会报错。