`

hibernate学习笔记第9讲-一对多关联映射one-to-many单向

阅读更多



 

 

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

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

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

两者映射策略是一样的,只是站的角度不同。

 

Hibernate一对多映射(class--àstudent单向):

一般用set集合,set里面的内容不可重复。也可以用别的集合。

 

在一的一端维护关系的缺点:

         *如果在t_student中的classId设置为非空not null,则无法保存。

         *因为不是在student一端维护关系,student不知道是哪个班的,所以会发出多余的update语句来更新关系。

通常会做成双向的,在多的一端维护关系。

 

Student.hbm.xml

<hibernate-mapping>

         <class name="com.bjsxt.hibernate.Student" table="t_student">

                   <id name="id">

                            <generator class="native"/>

                   </id>

                   <property name="name"/>

         </class>

</hibernate-mapping>

 

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">

                            <key column="classesid"/>

                            <one-to-many class="Student"/>

                   </set>

         </class>

</hibernate-mapping>

 

存储:必须先存学生,否则报错。

session.beginTransaction();

                            Student student1 = new Student();

                            student1.setName("10");

                            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();

加载:

                            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();

  • 大小: 19.3 KB
  • 大小: 25.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics