数据库oracle中的一个表中是联合主键但是hibernate在映射的时候我不希望使用联合主键来进行读取,因为这样要多生成一个类。
所以我就把映射文件aaa.xml里面的联合主键composite-id删除掉,然后使用随便一个联合主键中的字段来设置成主键id<composite-id name="id" class="entities.TSystemrolerightId">
            <key-many-to-one name="TSystemrole" class="entities.TSystemrole"  >
                <column name="ROLE_ID" length="20" />
            </key-many-to-one>
            <key-many-to-one name="TSystemright" class="entities.TSystemright"  >
                <column name="RIGHT_ID" length="10" />
            </key-many-to-one>
        </composite-id>
改成了<id name="ROLE_ID" type="java.lang.String">
            <column name="ROLE_ID" length="20" />
            <generator class="assigned" />
 </id>
<property name="RIGHT_ID" type="java.lang.String">
            <column name="RIGHT_ID" length="20" />
        </property>结果开始的时候很成功,可以进行插入和删除。但是后来数据一多就出现了一个问题;
因为是联合主键所以ROLE_ID是有重复的,读取出来的数据里面,如果第一条ROLE_ID对应的值为aaa的话,
以下所有的ROLE_ID为aaa的数据都将是跟第一条纪录是一样的。
打个比方:
ROLE_ID  RIGHT_ID 
aaa       bbbb
aaa       bbbb2
aaa       bbbb3
这样的数据,到最后出来的时候全变成
ROLE_ID  RIGHT_ID 
aaa       bbbb
aaa       bbbb
aaa       bbbb
这样了。。高手能指教一下吗???因为程序已经做好了。能不能只改hibernate的配置文件就能修改过来呀。。

解决方案 »

  1.   

    呵呵,早就应该想到会这样啊。如果你只用一个字段就能标识,还要联合主键干什么?可以考虑一个办法:将数据库设计为:ROLE_ID是唯一主键,但ROLE_ID的值是原来所有联合主键的字符串组合。不一定行,要看其他人使用这张表的需求。
      

  2.   

    楼上的。。
    不可能 这样的数据就无法维护了。。而且你这样的机制跟hibernate映射的机制没什么区别呀
    程序改动太大了。。
      

  3.   

    看来大家都这个都不怎么熟悉呀...
    我来打个比方吧..厂商->(厂商地区和名称)联合主键
    供应商->(供应商ID+厂商主键(联合主键))联合主键
    子供应商->(子供应商ID+供应商主键+厂商主键(联合主键))联合主键以此类推
    想想hibernate中的映射..一个子子子供应商中要有多少个对象创建呀??如果我直接修改hibernate中的映射,这样节省了多少的资源呢??想想..
    我可以在程序中自行处理它们的引用值问题..
    郁闷啊..
      

  4.   

    LZ的出发点就不正确,如果不希望用联合主键的话,那数据库为什么要设计成联合主键?再说了,LZ所说的节省资源是什么意思,不太明白,省了什么资源?
      

  5.   

    有的东西就是得联合主键的呀..
    数据库那边要联合主键呀..
    打个比方...不同省的同名的市...不同市的同名的镇..可以理解吗??
    你要是使用过hibernate的映射东西就明白了
      

  6.   

    角色权限表中根本roleId就不可能做为id不用复合主键的话就用非业务主键
    <id name="role_right_id">
          <generator class="uuid"/>
        </id>
      

  7.   

    这样就可以啊,不是什么高难度的问题吧
    <id name="role_right_id"> 
          <generator class="uuid"/> 
    </id>
    <property name="ROLE_ID" type="java.lang.String"> 
                <column name="ROLE_ID" length="20" /> 
    </property> 
    <property name="RIGHT_ID" type="java.lang.String"> 
                <column name="RIGHT_ID" length="20" /> 
    </property> 
      

  8.   

    user right是一个多对多的关系  user (m)-----(n) right
    也可以配置成
    user(1)----(n)user_right(n)-----(1)right
      

  9.   


    这样的话 hibernate查询出来的数据就会有重复的了..
    只要是 role_right_id 一样的它就会自动地归为一条记录了
      

  10.   

    role_right_id是uuid生成,怎么去重复
    role_right_id在数据库表中设置为主键,还能重复?
      

  11.   


    这个非业务主键是什么??
    我主要是不想修改数据库的结构和映射的类,就是只想修改一下映射的*.hbm.xml文件能达到这种效果吗??