补充一下,欢迎大家访问
http://www.goodindeed.com

解决方案 »

  1.   

    你混淆了逻辑主键和物理主键,而且在数据库设计上犯了错误。
    在hibernate中,我们操作的都是domain object,而每个domain object是需要一个逻辑主键来进行唯一标识。这个主键必须唯一,无业务含义,不可修改。在大部分情况下,我们会映射到物理表的物理主键上。
    你寻求修改主键的方法,这本身就违背了hibernate的设计思想。我敢说,你的物理表的主键肯定是有业务意义的(不然也不会有去修改它的需求吧)。
      

  2.   

    楼上的结论未必准哦,比如我是用oracle的sequence,现在要改成hilo或uuix的,这并不过分吧,同样不涉及到业务处理。
    对于楼主来讲,得看你要把主键改成什么样子了,你原来的主键是什么样子的。如果条件满足的话,直接更新主键也是可以的。
      

  3.   

    呵呵,什么叫增加物理主键会破坏对象间的约束关系啊?
    如果你用业务主键的话,以后万一需求更改,你的业务主键不再具有唯一性,那你就会死的很惨了。hibernate提供了assigned来提供对以前数据库这种设计的支持,但是推荐使用物理主键,是有原因的。比如举一个简单的例子来说:一个用户有一个userid,它可以作为主键,但是如果以后要求一个用户可以有多个帐号,你就没办法再进行匹配了。
    用物理主键的好处就是永远不会和用户需求冲突,所以涉及不到主键会更改的现象,除非是我上面所讲的那种比较变态的要求。
      

  4.   

    各有各的实现方法!能实现就是好的方法!当然前提是能通过一切测试,和易于管理!用逻辑主键OID来标识一个物理主键,多个用户用外键匹配!
      

  5.   

    我觉得还是尽量用物理主键吧,这是hibernate提倡的,省心。