本帖最后由 paullbm 于 2009-11-15 20:52:14 编辑

解决方案 »

  1.   

    为什么不引用ruleId呢,而是用ruleName?
    很基本的东西吧。
      

  2.   

    因为我一个权限对应多个规则,一个规则有多个规则项
    我也试过用ruleId,但发现没有使用ruleName方便。因为一个用户也是有多个权限的。
      

  3.   

    占个楼 学习下吧~建议楼主去J2EE发帖
      

  4.   

     用户--权限     one--many 用户里有个set<权限>
     权限--规则     one--many 权限中有个set<规则>
     规则--规则项   one--many 规则中有个set<规则相>
     
    根据你实际项目中的需求映射关系,需要则映射。有什么不方便呢。
      

  5.   

    我之所以使用ruleName而非ruleId的原因,是为了在进行查询用户权限的时候,能够直接根据规则名称检索出所有该名称对应的规则。如果采用ruleId的话,那就是一条一条的去检索。而且在前台展现时效果也不太好。当然,虽然也可以采用联接查询的方式把相应的字段给列出来。但我个人觉得,直接使用名称能够省很多事情。
      

  6.   

    只需要Privilege对Rule是单向的1:m的关系这样的话 只需要在Privilege的配置文件里面配置这个就好了<set name="rules">
                    <key column="ruleName"/>
                    <one-to-many class="Privilege"/>
                </set>
      

  7.   


    他这样写 不过 一个权限对应多个规则?应该加个关联表吧? 我始终也没明白你那个ROLENAME是什么 一个权限对应多个规则表 如果多个权限同时用一个规则?咋办呢?
      

  8.   


    你在set里设置的key中的column指的是主键。而ruleName是规则名称,不是规则表的主键。
    请再仔细看我最开始的描述,谢谢!
      

  9.   

    楼主在建立一张中间表吧如果不行,你是否可以试一下复合主键
    即:ruleId,ruleName
    同时作为role的主键
    你隐射的时候可以用ruleName隐射
    这样能达到一定的约束
    不知道是否能达到要求
      

  10.   

    这孩太死心眼了。使用引用完整性基本是键与键之间的关系。根据FD传递规则和键设计最小化的要求,你是没事找抽型。关键不知道目前数据库对CHECK约束到了什么级别。如果数据库目前已经发展到了这个级别,你可以<set XXXX check (username in (select XXX from t))hibernate 是支持约束检测的,但是没到这个级别就难了。违反引用完整性是发生在删除和修改上,写触发器,或是规则都可以。最后一句:要用name也至少加个唯一约束呀!
      

  11.   

    谢谢您的指点。权限表中我加了唯一约束。
    Privilege(privilegeId,userId,ruleName
    privilegeId是主键,后两个进行组合唯一约束!