hibernate多对多问题(小细节)

来源:互联网 发布:c语言编程实例100题 编辑:程序博客网 时间:2024/06/10 11:20

  Hibernate多对多 我这里是 学生和权限之间的关系:一个学生有好多权限,一个权限也可以属于好多学生(只是想模拟一下hibernate的多对多),


package com.zsq.Ssh_OA.model;import java.io.Serializable;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import org.apache.struts2.json.annotations.JSON;import org.hibernate.annotations.Cascade;@Entitypublic class MenuItem implements Serializable {private Long mid;private Long pid;// 父节点IDprivate String name;// 树上的节点的名称private Boolean isParent;// 是否为文件夹节点private String icon;// 图标图片的路径private Boolean checked;private String url;private String target;private Set<Student> students;@Id@GeneratedValuepublic Long getMid() {return mid;}public void setMid(Long mid) {this.mid = mid;}public Long getPid() {return pid;}public void setPid(Long pid) {this.pid = pid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Boolean getIsParent() {return isParent;}public void setIsParent(Boolean isParent) {this.isParent = isParent;}public String getIcon() {return icon;}public void setIcon(String icon) {this.icon = icon;}public Boolean getChecked() {return checked;}public void setChecked(Boolean checked) {this.checked = checked;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getTarget() {return target;}public void setTarget(String target) {this.target = target;}@JSON(serialize=false)@ManyToMany(mappedBy="menuItems")public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
这是student:

package com.zsq.Ssh_OA.model;import java.io.Serializable;import java.util.HashSet;import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;@Entitypublic class Student implements Serializable {private int id;private String name;private String password;private String sex;private int age;private Set<MenuItem> menuItems = new HashSet<MenuItem>();@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@ManyToMany@JoinTable(name="MenuIten_Student",joinColumns={@JoinColumn(name="id")},inverseJoinColumns={@JoinColumn(name="mid")})public Set<MenuItem> getMenuItems() {return menuItems;}public void setMenuItems(Set<MenuItem> menuItems) {this.menuItems = menuItems;}}

这样配置是正确的,我这里把Student作为参照类,也就是说以student为主。

下面的代码是对 数据库的更新操作

public String SavePrivilege(){System.out.println("uid:"+uid+ "....ids"+mids);  Student s=this.studentService.getStudentById(uid);int [] ids=UtilOA.getInt(mids);Set<MenuItem> items=menuItemService.getByIDS(ids);/*for(MenuItem m:items){m.getStudents().add(s);  //mappedBy 以menuitem为主,设置在menuitem里面menuItemService.updateMenuItem(m);System.out.println("....."+m.getMid()+"/"+m.getName()+"/"+m.getIcon()+"/ "+m.getPid()+"/"+m.getChecked()+"/"+m.getIsParent()); }*/s.setMenuItems(items);//mappedBy 以student为主,设置在student里面this.studentService.updateStudent(s);return SUCCESS;


这个是我验证后正确的做法,


我的错误做法是  在Student类里面配置的是@JoinTable(...) ,而在MenuItem里面配置的是Mappedby="students",我原本是想以Student为主的,这样我直接 按红色把student和menuitem关联然后存储student就行了(因为是以student为主),但是我的错误做法---将menuitem作为的参考类,然后直接更新student,后台不报错也不更新,我搞了好长时间,才觉得自己的表生成的有问题。

然后就有了上述的正确代码,


有点乱,写之记录记录。。。




0 0