一对多关联映射利用了多对一关联映射原理
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。
1.1.1.一对多关联单向
l 步骤:
n 建立POJO:Classes.java,Student.java,建立hibernate配置文件,将两个hbm文件与其绑定
n 在Classes.java里面建立一个Set类型的属性准备装学生
n 在Classes的hbm文件中增加:
| <set name=”set属性名称” table=”对应的另一个表名称” lazy=”false” (延迟加载选项) cascade=”all | none” (是否级联) order-by=”某属性 asc” > <key column=”外键列名”></key> <one-to-many class=”另一个类的名称”/> </set> |
l 代码实现:
Classes.java
| public class Classes { private int id; private String name; private Set students; |
Student.java
| public class Student { private int id; private String name; |
Classes.hbm.xml
| <hibernate-mapping package="com.bjsxt.hibernate"> <class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students" table="t_student" lazy="false" cascade="all" order-by="id desc" > <key column="classesid"/> <one-to-many class="Student"/> </set> </class> </hibernate-mapping> |
Student.hbm.xml
| <hibernate-mapping> <class name="Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping> |
测试类:
| public class One2ManyTest extends TestCase { public void testSave1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Student student1 = new Student(); student1.setName("张三"); //session.save(student1); //配置了级联就不需要保存,否则就需要保存 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(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction();
Classes classes = (Classes)session.load(Classes.class, 1); System.out.println("classes.name=" + classes.getName()); Set students = classes.getStudents(); for (Iterator iter=students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println("student.name=" + student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } } |
关于lazy属性:
n lazy – 延迟加载(懒加载),一般用于集合的抓取策略,也就是说只在需要用到的情况下,再发出select语句,将其相关的对象查询出来
n set默认lazy属性的值是true,即hibernate会自动使用懒加载策略,以提高性能
1.1.2.一对多关联双向
当表格配置了逐渐外键关系,单纯一对多是有bug,必须还要配置多对一:配置多对一关联
步骤基本与单向一直,只需按下列操作即可:
n 在Student内增加Classes的属性
n Student.hbm.xml内增加:
| <many-to-one name=”属性名称” Class=”属性类型” Insert=”false” Update=”false” Cascade=”none” Column=”对应列”/> |
n 在Classes.hbm.xml内set标签内增加:inverse=”true” 表示它是被动方
n 任给一个学生,能够得知他所在班级
关于inverse属性:
inverse – 标记由哪一方来维护关联关系(双向关联中会用到),inverse – 标记由哪一方来维护关联关系(双向关联中会用到),inverse默认值为false,如果inverse设置为true,表示将由对方维护两者之间的关联关系。

本文介绍了一对多关联映射的实现方式,包括单向和双向关联的具体配置方法,并提供了详细的代码示例。
1683

被折叠的 条评论
为什么被折叠?



