Hibernate学习14 -- 关联映射4 -- 一对多关联

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

一对多关联映射利用了多对一关联映射原理

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一

一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。

1.1.1.一对多关联单向

clip_image002

l         步骤:

n         建立POJO:Classes.javaStudent.java,建立hibernate配置文件,将两个hbm文件与其绑定

n         Classes.java里面建立一个Set类型的属性准备装学生

n         Classeshbm文件中增加:

<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.xmlset标签内增加:inverse=”true” 表示它是被动方

n         任给一个学生,能够得知他所在班级

关于inverse属性:

inverse 标记由哪一方来维护关联关系(双向关联中会用到),inverse 标记由哪一方来维护关联关系(双向关联中会用到),inverse默认值为false,如果inverse设置为true,表示将由对方维护两者之间的关联关系。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值