解决方案 »

  1.   

    很明显是多对多的关系
    假设user:id,name
    role:id,name
    user_role:id,user_id,role_id;这样就实现了多对多的关系,一个用户可以有多个角色,一个角色对应多个用户你插入一个用户的时候,只需要向user_role表中插入数据就可以了也就是说你说的那种是可以实现的,那么这个时候需要看你的hibernate如何配置啦User类:
    public int id;
    public String name;
    private List<Role> roles;//在其set方法上添加注解@oneToMany
    Role:
    int id,
    int name;
    List<User> users//在set方法上添加注解@oneToMany我想这样应该可以解决你的问题
      

  2.   


    刚试了一下,还是会在三个表中都插入~! 不知道是不是我写的有问题People类:
    private Set<RoleInfo> peopleRole = new HashSet<RoleInfo>();hbm
    <set name="peopleRole" table="people_role" lazy="true">
    <key column="peoplecode"/>
    <many-to-many column="roleId" class="RoleInfo" unique="true"/>
    </set>
    role:
    private Set<XPeople> rolePeople = new HashSet<XPeople>();

    hbm
    不配置action中:
    xpeople.getPeopleRole().add(roleInfo);
    registerService.save(xpeople);就是从页面拿到roleInfo对象(包含用户选择的角色的id),在赋给xpeople,存储xpeople,结果存入了三个表
      

  3.   

    配置一下<set name="rolePeople" table="role_people" lazy="true">
    <key column="rolecode"/>
    <many-to-many column="peopleId" class="People" unique="true"/>
    </set>
      

  4.   

    你把它的sql语句打印出来看看呢?
      

  5.   


    打印出来就是三个insert ....单向双向都试了
    cascade也配过了
    inverse也配过了
    unique也配过了难道多对多要么只插入一个主表,要么就插入三个表?不能只插入一个主表一个中间表吗?~!?
      

  6.   

    我们重新来理一下问题吧,你是想要实现manytomany单向还是双向,如果是单向,我用注解来给你举个例子
    拿学生和老师之间的关系来举一个例子哈!Teacher:
     private Set<Student> students;
     @ManyToMany
     @JoinTable(name="t_s",joinColumns={@JoinColumn(name="t_id")},
       inverseJoinColumns={@JoinColumn(name="s_id")})/*t_s,表示生成外键表的名字,joinColumns表示和teacher表中id对应的字段,之所以是数组有可能某个表示联合主键    inverseJoinColumns表示和student表中id对应的字段
    */
     public Set<Student> getStudents() {
      return students;
     }Student:
        @Entity
    public class Student {
     private int id;
     private String name;
     
     @Id
     @GeneratedValue
     public int getId() {
      return id;
     }
    }
    如果是双向的话:ManyToMany双向:Teacher类如上不改变Student:
        private Set<Teacher> teachers;
     
     @ManyToMany(mappedBy="students")
     public Set<Teacher> getTeachers() {
      return teachers;
     }
    采用配置文件的方式:
    单向:xml映射:
        Teacher.hbm.xml文件映射:
     <hibernate-mapping package="cn.study.domain">
     <class name="Teacher">
      <id name="id">
       <generator class="native"></generator>
      </id>
      <property name="name"></property><!--key中的column表示对应于当前这个类(即Teacher)的id的那一列叫什么名字-->
      <set name="students" table="t_s">
       <key column="t_id"></key>
       <many-to-many class="Student" column="s_id"></many-to-many>
      </set>
     
     </class>
    </hibernate-mapping>
    双向:xml映射:
        Teacher.hbm.xml内容如单向:    Student.hbm.xml更改如下:
       <set name="teachers" table="t_s">
       <key column="s_id"></key> //相对于本类,即Student
       <many-to-many class="Teacher" column="t_id"></many-to-many>
      </set>
      

  7.   

    其实很简单,你已经想到了级联。
    user_role里不要设置级联。
    user和role设置级联
      

  8.   


    先谢谢你耐心的回答!
    我现在的情况和你给的例子的配置是一样的,多对多,单向双向都试过,cascade加与不加我也试过,就比如以你的配置,我在页面添加用户,后台这么写//前台的bean有两个
    //xpeople表示用户基本信息
    //roleInfo表示用户勾选的角色信息,
    //roleInfo和XPeople是多对多
    xpeople.getPeopleRole().add(roleInfo);

    registerService.save(xpeople);这个时候如果我设置了级联关系cascade="all",那么save完成之后会出现
    insert  into peopleInfo.....
    insert into people_role....
    insert into roleinfo....
    这样就在角色表里面插入数据了,不行如果不设定级联
    hibernate会报错,说我指向了一个瞬时对象,实际就是说我保存用户时关联了角色,需要先保存角色,再保存用户,但是由于我没有设置级联,所以保存就报错~ 最后的结果就是,只插入了peopleinfo,其余的两个没有改变--因为报错如果我不设定级联,为了消除上面的错误,这么写
    xpeople.getPeopleRole().add(roleInfo);
    registerService.saveRole(roleInfo);
    registerService.save(xpeople);
    效果也是会在角色表里面插入数据,因为是我自己保存了! 最后的结果就是,设定级联要么插三个表,要么只插一个表!!! 不好使啊!!!
      

  9.   


    你说的不是很理解
    首先我不能在role里面插入数据,所以如果user和role设置了级联,那么不就是我现在的情况吗--插入user会级联插入role!所以我觉得应该是user和user_role设定级联,保存user,也保存user_role,而role不用插入数据,只需要起到一个提供数据参考的作用!!! 
    是这样吗?
    能实现吗?求指点
      

  10.   


    先谢谢你耐心的回答!
    我现在的情况和你给的例子的配置是一样的,多对多,单向双向都试过,cascade加与不加我也试过,就比如以你的配置,我在页面添加用户,后台这么写//前台的bean有两个
    //xpeople表示用户基本信息
    //roleInfo表示用户勾选的角色信息,
    //roleInfo和XPeople是多对多
    xpeople.getPeopleRole().add(roleInfo);

    registerService.save(xpeople);这个时候如果我设置了级联关系cascade="all",那么save完成之后会出现
    insert  into peopleInfo.....
    insert into people_role....
    insert into roleinfo....
    这样就在角色表里面插入数据了,不行如果不设定级联
    hibernate会报错,说我指向了一个瞬时对象,实际就是说我保存用户时关联了角色,需要先保存角色,再保存用户,但是由于我没有设置级联,所以保存就报错~ 最后的结果就是,只插入了peopleinfo,其余的两个没有改变--因为报错如果我不设定级联,为了消除上面的错误,这么写
    xpeople.getPeopleRole().add(roleInfo);
    registerService.saveRole(roleInfo);
    registerService.save(xpeople);
    效果也是会在角色表里面插入数据,因为是我自己保存了! 最后的结果就是,设定级联要么插三个表,要么只插一个表!!! 不好使啊!!!insert三条语句是正确的呀?因为你一个人有了一个新的权限之后.,那么肯定是要更新表的呀,因为你XPeople中有一个list保存了RoelInfo的,同理其他也是的呀,要么就使用单向的