Hibernate用了还是很久了。但是最近做的一个项目遇到一个看似简单的问题,但是用了几天都没有解决的一个问题如下:用Address和person来举例
三个数据表:address: int id-pk,
            person: int id-pk ,
            add_per: int aid, int pid,int adx,int pdx
hibernate就是用的List基于中间表的多对多,
开始用起来似乎没有问题,后来发现增加的时候只会有update或者是被save的一方被增长index,如果说一起update或者save也一样,删除的时候还会报Duplicate entry key的错误
哎~几天了~~大家帮我看看,谢谢~在线等哦~~

解决方案 »

  1.   

    双向List多对多映射
    好的我补充一下配置:------------address的配置-------------------------
    <list name="persons" inverse="false" table="add_per" cascade="save-update" lazy="false">
    <key column="aid"/>
    <index column="pdx" type="java.lang.Integer"></index>
    <many-to-many column="pId" class="Person"/>
    </list>
    </class>
    </hibernate-mapping>
    ------------person的配置---------------------------
    <list name="addresses" inverse="true" table="add_per" cascade="save-update" lazy="false">
    <key column="pId"/>
    <index column="adx" type="java.lang.Integer"></index>
    <many-to-many column="aId" class="Address"/>
    </list>
    </class>
    </hibernate-mapping>
      

  2.   

    项目设计的时候 多对多很少用,还有关联关系一般都是单向的,维护起来方便就算用到多对多,一般都是拆成两个多对一,建立一个中间表,分别持有关联两端引用
    然后用多对一进行映射。
    多对多用hibernate自生成的本来就很复杂(它也是自动帮你生成一个中间表,但是配置有点多、混),
    你还弄一个双向,试想一下,对于生成表的结构你能一下明了过来吗就拿你这个来举例 
    address: int id-pk, 
    person: int id-pk , 
    add_per: int aid, int pid,int adx,int pdx 你自己建一个实体类就叫
    Add_Person, 属性:
    private int id ;
    private Address address; <多对一>
    private Person person ;<多对一>OK在给这个实体类加一个配置文件,就行了思路也清晰了,项目中一般就是这样做的啊
      

  3.   

    你还查 add_per: int aid, int pid,int adx,int pdx 的映射啊address《1对多--》add_per 《-多对1-》person 
      

  4.   


    其实你如果这样写的话相当于就是用单纯的sql来做了,我那样配置就是用中间表来解决这个问题的。而且其他人说的都是拆开。恩·不过后来我也是这样做的。估计是本身hibernate就没有提供这样的完善的解决方案。
      

  5.   

    这里可能有你要的答案 Hibernate中多对多关系的常见问题  :http://www.phome.asia/forum/thread/17651.html
      

  6.   

    这会不会是级联保存时的问题
    你把cascade设置称all试试其实cascade可以不设置的,你两方都手动保存呗。