一对多(One2Many)

一对多(one2many)实现的方法为:

* 1、发现对象、创建实体类。例如:班级(classes)和学生(Student),班级中的属性有int id,String name(多对一的关系,多个学生对应一个班级,后期的实现

为 先创建学生,然后班级添加学生即可,班级要定义个Set接口的变量(因为Set是不重复的)例如,private Set student;)

* 2、创建类的映射文件(hbm)先从简单的映射做起,例如student中只有id和name。(如果映射中的路径重复出现的话可以在<hibernate-mapping>中定义package,更为
方便的来写路径),然后定义classes的hbm文件 其它字段正常定义 但 外键的定义有变化,代码为:<set name="students"> (classes中定义的Set 的 变量)
<key column="classesid"/> (数据库中列的名字)
<one-to-many class="Student"/> (外键对应的类)
</set>
* 3、以上步骤都完毕的话就可以生成表了,注意一点classesid的列属性 把非空去掉为允许为空,这也是一对多的弊端,这些会在笔记的后面做注释。

* 4、然后可以创建测试类代码如下:


session.beginTransaction();

Student student1 = new Student();
student1.setName("10");
session.save(student1);
//创建一个学生信息要save下,不然后面会抛出异常;

Student student2 = new Student();
student2.setName("祖儿");
session.save(student2);

Set students = new HashSet();
students.add(student1);
students.add(student2);

Classes classes = new Classes();
classes.setName("尚学堂");
classes.setStudents(students);

//可以正确保存
session.save(classes);

session.getTransaction().commit();

//以上的执行过程为,创建学生信息(classesid暂时为空)--然后保存--然后创建班级信息--然后添加学生信息--然后save--hibernate会执行update把班级id

更新到学生信息为空的classesid中;



* 5、读取的测试类代码如下:

session.beginTransaction();

Classes classes = (Classes)session.load(Classes.class, 1); //读取classes中id为1的信息;
System.out.println("classes.name=" + classes.getName()); //输出classes id为1的name;
Set students = classes.getStudents();
for (Iterator iter=students.iterator(); iter.hasNext();) { //通过迭代取出classesid对应的学生name 列出;
Student student = (Student)iter.next();
System.out.println("student.name=" + student.getName());
}
session.getTransaction().commit();




注:在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
  所以需要发出多余的update语句来更新关系

例子可以参考尚学堂的代码;

你可能感兴趣的:(Hibernate)