generator class = "native" 
就可以了!

解决方案 »

  1.   

    第一种情况:
        如果你的人员ID不是由数据库生成的,而是自己控制的类似于UUID的唯一字符串,那么只要在添加人员的时候直接将通讯信息中的主键也存入就可以了。
    第二种情况:
        如果你的人员ID是数据库生成的,那么在做级联操作的时候要控制反转,将主控权交给你的通讯表,即在hbm文件中在该字段的配置中加入inverse="true"就可以了,不然会出错。
    我做过类似的功能,另外<<Hibernate从入门到精通>>这本书上有很详细的介绍,你可以参考一下,如果有说的不对的地方请达人指正,谢谢!
      

  2.   

    To:xufei547
    通讯方式主键并不是自增长的,我的设计是由第一个级联增加的主键决定。因此设置generator class = "native"  只能引起增加时主键为空的错误。
    To:grubbyfan
    你的第一种情况在题目中已经被否定,前提是人员id是自增长的,而且我的想法是完全交给hibernate去做。如果脱开hibernate这个关系是很好实现的。第二种情况中,你的说法有一个很大的悖论,如果设置主控权交给通讯表,应该是将inverse="fasle",这样通讯表才能不失掉他的主控。你的想法是在人员中设置inverse="true",而那样是不可能的。先抛开设计上的角度来说。如果主控交给了通讯表,在进行通讯表的save时,我需要确定通讯你表的主键标示,这样只能从他下边的set去取,这样的话就不能完全交给hibernate去处理。因此也不能实现题目的设想。
    另:夏昕那本书我曾经也翻过,您说完了我又翻了下。还是没有讲述我提出的这种关系的模型。能否提供给我一个页数,我再仔细看下。感谢楼上两位的意见。目前为止我还是认可这个题目的意义(在javaeye上有人认为这个题目没什么意义,我反述了其无意义的思想的悖论)希望能引入更多的人来针对这个题目进行讨论。
      

  3.   

    上次没有仔细看,完全误解了您的需求,呵呵,非常抱歉!
    1. 今天仔细看了一下,我觉得您这个所谓的一对多关系有点牵强,我们建表一般都是为了简化问题的,而您的表结构设计反而将问题复杂化了,如果硬是要Hibernate的牛角尖的话,我觉得没有必要。我不能说您这个问题没有什么意义,但我认为这个问题有更好的解决方案,可以转换成标准的一对多关系,不知道您为何一定要用这种及其特殊的方法。
    2. 假设您一定要这么做的话,我建议通过程序来实现,也就是说在进行数据库操作之前先进行一次判断,如果说您一定要寻找简单的配置来解决的话,恐怕我水平不够了。