many-to-many 这是映射关系中最不大好解决的问题。以前没大用过,由于业务需求昨天用了一下,出了bug,bug描述如下:

user和role属于多对多的关系,当为user添加岗位role时,死活添加不进去roles这个属性,而其他的属性都能添加成功。查看后台自动生成显示的数据库操作语句只有:

 

insert 
    into
        t_user
        (department_id, description, email, gender, loginName, name, password, telephone) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        t_user
        (department_id, description, email, gender, loginName, name, password, telephone) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)

很明显没有将role与user的关系加进表里(就是说表明关系的一条记录)。

纠结中。。。。。。。。。

今天早晨偶发灵感,解决了这个闹心的bug。哎,关键时刻靠自己。

晒代码:

role:

@ManyToMany(mappedBy="roles",cascade=CascadeType.REFRESH)
public Set<User> getUsers() {
return users;
}

user:

@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="user_role", joinColumns={@JoinColumn(name="user_Id")},   
       inverseJoinColumns={@JoinColumn(name="role_Id")})

重点:理解mappedBy的意义,mappedBy一定要定义在被控制的一端(也就是相当于小跟班的),他指向控制端的属性.在这里user添加role属性,这里关系是user在维护,也就是说因为user要被分配岗位,所有user和role才有的关系。所以role是被控制端,user是大boss。

级联属性的话:建议写refresh,不能写级联删除,比如user已删除,所有的岗位就删除啦,。。。发生连锁效应不好。

如果上面的关系对调的话,那么想在user里面加上role属性,那你就加加试试吧,根本加不进去,呵呵


现在的自动生成的语句为:

 insert 
    into
        t_user
        (department_id, description, email, gender, loginName, name, password, telephone) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        t_user
        (department_id, description, email, gender, loginName, name, password, telephone) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
08:45:44,805 DEBUG SQL:111 - 
    insert 
    into
        user_role
        (user_Id, role_Id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        user_role
        (user_Id, role_Id) 
    values
        (?, ?)

中间表中有了一条关系的记录。正常。