在一对多关系中为什么要让多的一端维护关联关系

有两个类,Class表示班级,Student表示学生,两者之间是一对多的关系。

Class有以下属性:

private int id;//id号
 private String name;//班级名
 private Set students;//学生集合

Student有以下属性:

private int id;//id号
 private String name;//姓名
 private Class cla;//班级

 

Class.hbm.xml配置如下:

 <hibernate-mapping>
 <class table="t_class" name="cn.edu.cqu.model.Class">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <set name="students" cascade="all">
   <key column="cid"/>
   <one-to-many class="cn.edu.cqu.model.Student"/>
  </set>
</class>
</hibernate-mapping>

 

Student.hbm.xml配置如下:

<hibernate-mapping>
 <class table="t_student" name="cn.edu.cqu.model.Student">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <many-to-one name="cla" column="cid"/>
 </class>
</hibernate-mapping>

 

这时候,在Class的映射文件中的一对多标签中没有配置inverse属性,表示这个一对多关系由Class主控,这时,如果通过Class存储Student(在一对多标签中配置了cascade="all",存储Class的时候会将与之关联的Student也存储到数据库中),比如:

 session.beginTransaction();
   cn.edu.cqu.model.Class c1=new cn.edu.cqu.model.Class();
   c1.setName("软件班");
   Set students=new HashSet();
   c1.setStudents(students);
   
   Student s1=new Student();
   s1.setName("Tom");
   
   c1.getStudents().add(s1);
   session.save(c1);
   session.getTransaction().commit();

Hibernate在存储Student的时候会执行两条sql语句:

Hibernate: insert into t_class (name) values (?)

Hibernate: insert into t_student (name, cid) values (?, ?)
Hibernate: update t_student set cid=? where id=?

第一条语句将Student存储到数据库中,cid为空,第二条语句由Class对象将刚才存入数据库中的Student的id号设为自己的id号

如果将Student的cla属性配置为not-null="true",即表t_student的cid字段为not null就会出现异常:

not-null property references a null or transient value: cn.edu.cqu.model.Student.cla

 

所以,在配置一对多关系的时候,最好将关联控制交给多的一端维护。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值