最近研究了下hibernate的级联删除.有几个问题,大家来帮帮忙.
(1)用<many-to-one>实现一对一的情况下,也就是用外键关联的方式实现一对一也不能写cascade="delete"是么?
(2)用<one-to-one>实现一对一关联的情况下.不如我一个Person类里有一个IdCard类的引用,有一个Address的引用,就是说一个person对应一个IdCard并且对应一个Address.这种情况下根本就没法用主键一对一的方式去映射了是么?必须用外键关联也就是<many-to-one>的方式去实现一对一是吗?那也就是说级联删除根本也就用不了了是么?

解决方案 »

  1.   

    第二个问题应该可以把Adress放到Idcard的属性里面吧,这样在person里面就只用引用Idcard了
      

  2.   

    (1)要实现级联删除cascade="delete"是要写上的
    (2)可以考虑使用联合主键
      

  3.   

    首先hibernate中通常在<many-to-one>或<many-to-many>关系中应用级联没什么意义。
    但楼主所说的第一种情况:<many-to-one>你要做成一对一,那肯定会加unique="true"属性,这时你完全可以加cascade="delete",因为这时的对应关系是一对一,所以级联删除很有意义。而楼主所说的第二种情况:应该加个第三方表,即这个中间表中有三个字段作为联合主键,最好别用主键关联,其实一对一主键关联默认就有all级联关系,其他关联关系都没有这种默认设置。如果楼主想用<one-to-one>这样主键关联这三张表也可以,你配置时就两个两个一关联,都配成双向一对一,这样不用你加cascade="delete"属性,直接就可以删除所级联的对象。
    还有为什么你要把hibernate的映射关系搞这么复杂呢?对自己和项目都没有任何的好处,你现在可以去公司看看,还有几个项目经理会用hibernate的映射关系?记得我框架老师曾经说过,“用hibernate做映射时只要配置单个类和它的普通属性就行了,如果你连关系的映射也配置了,那灾难就离你不远了!”还有我觉得楼主很像陕西人,嘿嘿!