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 (?, ?)
中间表中有了一条关系的记录。正常。