Hibernate关联关系映射_多对一双边

业务需求:既要查询某个学生所在的班级,也要查询一个班级中都有哪些学生

 

实体:班级类持有学生类的集合引用,学生类持有班级的引用。(省略setter getter方法)

 

public class Clazz {
 
    private int id;
    private String name;
   
    private Set<Student> students;
   
    }
   
public class Student {
 
 
    private int id;
    private String name;
   
    private Clazz clazz;
   
    }


 

映射文件:

 

Student.hbm.xml

<hibernate-mapping package="entity" >
    <class name="Student" table="tb_student">
       <id name="id">
           <generator class="identity"></generator>
       </id>
       <property name="name"></property>
        <!—这个标签描述clazz的引用-->
       <many-to-one name="clazz" column="classId"class="Clazz" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

 

Clazz.hbm.xml

 

<hibernate-mapping package="entity" >
    <class name="Clazz" table="tb_calzz">
       <id name="id">
               <generator class="identity"></generator>
       </id>
       <property name="name"></property>
       <!—这个标签描述Student的集合引用-->
        <set name="students"inverse="true" cascade="all">
           <!--指定外键列名-->
            <key column="classId"/>
           <!--映射关联类-->
            <one-to-many class="Student"/>
        </set>
    </class>
</hibernate-mapping>


 

 

表结构:

 

mysql>desc tb_calzz

    -> ;

+-------+--------------+------+-----+---------+----------------+

|Field | Type         | Null | Key |Default | Extra          |

+-------+--------------+------+-----+---------+----------------+

|id    | int(11)      | NO  | PRI | NULL    | auto_increment |

|name  | varchar(255) | YES  |     |NULL    |                |

+-------+--------------+------+-----+---------+----------------+

 

 

mysql>desc tb_student;

+---------+--------------+------+-----+---------+----------------+

|Field   | Type         | Null | Key | Default | Extra          |

+---------+--------------+------+-----+---------+----------------+

|id      | int(11)      | NO  | PRI | NULL    | auto_increment |

|name    | varchar(255) | YES  |     |NULL    |                |

|classId | int(11)      | YES  | MUL | NULL    |                |

+---------+--------------+------+-----+---------+----------------+

 

测试:

 

在多的一方维护关系

 

@org.junit.Test
    public void testSave(){
      
       Student s1 = new Student();
       Student s2 = new Student();
       Clazz c1 = new Clazz();
       Clazz c2 = new Clazz();
      
      
       s1.setName("s1");
       s2.setName("s2");
      
       c1.setName("c1");
       c2.setName("c2");
      
       s1.setClazz(c1);
       s2.setClazz(c2);
      
       Session session = HibernateSessionFactory.getSession();
       Transaction tra = session.beginTransaction();
      
       try{
          
           session.save(s1);
           session.save(s2);
          
           tra.commit();
          
       }catch(Exception e){
           e.printStackTrace();
           tra.rollback();
       }
    }

  

测试结果:

 

   create table tb_calzz (id integer not nullauto_increment, name varchar(255), primary key (id))

   create table tb_student (id integer not nullauto_increment, name varchar(255), classId integer, primary key (id))

   alter table tb_student add index FK9007E96A1CD10D00 (classId), add constraint FK9007E96A1CD10D00 foreign key (classId) referencestb_calzz (id)

   SchemaUpdate:217 - schema update complete

  

 

在一的一方维护关系


@org.junit.Test
    public void testSave2(){
      
       Student s1 = new Student();
       Student s2 = new Student();
       Clazz c1 = new Clazz();
       Clazz c2 = new Clazz();
      
      
       s1.setName("s1");
       s2.setName("s2");
      
       c1.setName("c1");
       c2.setName("c2");
      
       Set<Student> students  = new HashSet<Student>();
       students.add(s1);
       students.add(s2);
      
       c1.setStudents(students);
       c2.setStudents(students);
      
       Session session = HibernateSessionFactory.getSession();
       Transaction tra = session.beginTransaction();
      
       try{
          
           session.save(c1);
           session.save(c2);
          
           tra.commit();
          
       }catch(Exception e){
           e.printStackTrace();
           tra.rollback();
       }
      
    }


 

测试结果

 

  create table tb_calzz (id integer not nullauto_increment, name varchar(255), primary key (id))

 create table tb_student (id integer not nullauto_increment, name varchar(255), classId integer, primary key (id))

 alter table tb_student add index FK9007E96A1CD10D00 (classId), add constraint FK9007E96A1CD10D00 foreign key (classId) referencestb_calzz (id)

 schema update complete

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值