hibernate多对多映射

    hibernate的映射关系网上介绍的人很多。但有没有感觉看完之后就忘掉,或则刚看完还是能记住,可是过一会儿,又搞不清楚哪个表,哪个字段,哪个属性了。IDE可以根据DTD给你提示,但是仔细一看,都是差不多的元素,什么one2many,many2many,什么column,table,IDE可是没有给你提示这些东西是对应哪个的,就算是用IDE生成出来的东西,也经常会出错,需要修改。说了这么多废话,现在切到主题。
    我们都知道,hibernate的多对多映射是通过一个链接表的实现的。链接表是纽带。多对多中。两个JAVA对象如何才能表示多对多?我们最容易想到的方式就是在各自的成员变量里面,都包含一个集合(Set),来包含N多个另外一个对象。比如一本书可以有很多读者,这样书这个类里面就定义一个Set来包含N多个读者对象。反之亦然。
    其它的我就不罗嗦了,多对多关键就一个Set(当然List等其它情况,类似)。

假设A,B两个类多对多:
在 A.hbm.xml中,有下面一项:

<set name="A中的Set<B>" table="A-B链接表名">
         <!--这里不一定是泛型,只是表示说这个Set是放B的 -->
        <key column="外键A"/> 
         <!--
              这里的"外键A"就是"链接表"中相对于A的ID,也就是说这个column是在"A-B链接表"中的某一个column ,对应的ID是"A的表"中的ID-->

        <many-to-many class="类名B"  column="外键B"/>
         <!--
             这里的"外键B",也是在 "A-B链接表"中的column,对应的ID就是"B的表"中的ID了。
-->
  </set>

这只是单向,双向另一个也类似写一下就OK了,对于有些cascade,inverse等,如何设置,就看你自己后面怎么用了,因此就不罗嗦了。

总结:
1、Set --- 含Set的一方,它对应的肯定可以多个。也就是 X to-many类(当然你也可以限制它为唯一的。这里any也有,但应该不常见)
2、Set标签里面key -- "链接表"中的column,对应本类的ID。
3、多对多,Set标签里面是用many-to-many,Set标签里面可没有 X to-one的,否则还要Set来做什么呢。这里的column也是在"链接表"中的列,这么记:与上面key的column那个不同的就是了。
再顺便提一下有时会碰到的情况,在保存时,链接表中的对应数据没有插进去,试着调用一下session.flush(),当然如果是手动提交,我想应该没有这个问题。
表答得比较混乱,见谅了。

你可能感兴趣的:(xml,Hibernate,ide)