有一对一,多对一和一对多,当然还有多对多,现实中也有不少例子,比如交友关系,一个人可以交到多个朋友,也可以是多个人的朋友。还有班级和学生,一个班级可以有多个学生,一个学生也可以在多个班级上课。
Hibernate使用@ManyToMany注解表示多对多,这里在Person.java类中定义一个friends属性。除了@ManyToMany注解,还需要一个@JoinTable注解作为关系表,表名为person_friend,生成朋友的对应关系。另外,joinColumns 和inverseJoinColumns 分别代表主方和对方,也就是一个是另一个对方的朋友,对应的字段名为person_id和friend_id。
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "person_friend",
joinColumns = @JoinColumn(name = "person_id"),
inverseJoinColumns = @JoinColumn(name = "friend_id"))
private Set friends;
public Set getFriends() {
return friends;
}
public void setFriends(Set friends) {
this.friends = friends;
}
重启服务后,在数据库里有一张中间表person_friend生成了。现在从页面输入一个fids的字段,把id用逗号隔开输入并传入到PersonController.java中。PersonForm.java用于接收参数的变量定义为fids。
private String fids;
public String getFids() {
return fids;
}
public void setFids(String fids) {
this.fids = fids;
}
在PersonController.java中把fids参数用逗号隔开放入数组,再按id把Person记录查询出来放到集合Set中,给newPerson设置friends属性存入数据库。
@RequestMapping(value = "/inputPerson", method = RequestMethod.POST) public Object inputPerson(HttpServletRequest request, HttpServletResponse response, PersonForm personForm) { try { // String id = request.getParameter("id"); // String nation = request.getParameter("nation"); // // String information = request.getParameter("information"); Person parent = personService.findPerson(personForm.getPid()); Set friendSet = new HashSet(); String friendIds = personForm.getFids(); String[] friendArray = friendIds.split(","); for(int i=0; i < friendArray.length; i ++) { Person friend = personService.findPerson(friendArray[i]); friendSet.add(friend); } Person newPerson = new Person(); newPerson.setId(Integer.parseInt(personForm.getId())); newPerson.setNation(personForm.getNation()); newPerson.setInformation(personForm.getInformation()); newPerson.setGender(personForm.getGender()); newPerson.setHobby(personForm.getHobby()); newPerson.setParent(parent); newPerson.setFriends(friendSet); personService.addPerson(newPerson); Person person = personService.findPerson(personForm.getId()); request.setAttribute("person", person); } catch (Exception e) { e.printStackTrace(); } return "index"; }
在页面上输入fids的值12,13,14这些,提交后保存到数据表,现在表中就有了三条新的记录,代表这些记录之间的朋友关系。
Java视频教程