开始我不理解下面代码的写法和不student中不加school的区别,第一次写这个问题的时候不太理解,后来看了hibernate的双向多对一才有所理解。所以才此处记录下我的疑问和我自己的解答。
然后写的这个文章的答案部分。
其实我不理解的问题是两个:
多对一和一对多的本质区别和代码上的区别?
当我们在school上加一个set后为什么可以做到对student的外键的修改?不是十分理解为什么?(有待解决)
这是一个一对多关系的javabean类,注意Student类中有一个School的参数。正常我们写javabean的时候只在School那方写一个set集合。Student写一个School,确实可以实现直接查找一个学生的学校是什么?
答案:不可以。如果只是写一个set集合,是能实现从school那方查看student的情况。
那是不是如果我们正常的javabean写法,只能在数据库中对外键进行数据的增加,并不能实现查找一个学生的所在学校的这个实现?
答案:如果是单项的多对一是的。
那如果hibernate时有这么写,那么是不是也不能实现?
答案;是的,和是不是hibernate无关。只要这么写的javabean都是单项。
其次,为什么我们在school.getAllStudent().add(new student()); 的时候,可以实现在数据库中对student表中外键的增加?
这个还不懂。。
但是如下的这个代码,他在student的类中还声明一个school的参数,其实就是实现了双向的多对一。双方都可以实现数据的查看和更改。(这是我在看了hibernate存在一对多和多对一时才明白的。)
1 import java.util.*;
2 public class TestDemo{//设置学校和学生的关系
3 public static void main(String args[]){
4 School sch = new School("清华大学") ;//实例化学校对象
5 Student s1 = new Student("张三",21) ;//实例化学生对象
6 Student s2 = new Student("李四",22) ;
7 Student s3 = new Student("王五",23) ;
8 sch.getAllStudents().add(s1) ;//在学校中加入学生
9 sch.getAllStudents().add(s2) ;
10 sch.getAllStudents().add(s3) ;
11 s1.setSchool(sch) ;//一个学生属于一个学校
12 s2.setSchool(sch) ;
13 s3.setSchool(sch) ;
14 System.out.println(sch) ;
15 Iterator<Student> iter = sch.getAllStudents().iterator() ;
16 while(iter.hasNext()){
17 System.out.println("\t|- " + iter.next()) ;
18 }
19 }
20 }
21
22 //学生类
23 class Student{
24 private String name ;
25 private int age ;
26 private School school; // 一个学生属于一个学校
27 public Student(String name,int age){
28 this.setName(name) ;
29 this.setAge(age) ;
30 }
31 public void setSchool(School school){
32 this.school = school ;
33 }
34 public School getSchool(){
35 return this.school ;
36 }
37 public void setName(String name){
38 this.name = name ;
39 }
40 public void setAge(int age){
41 this.age = age ;
42 }
43 public String getName(){
44 return this.name;
45 }
46 public int getAge(){
47 return this.age ;
48 }
49 public String toString(){
50 return "学生姓名:" + this.name + ";年龄:" + this.age ;
51 }
52 }
53
54 //学校类
55 class School{
56 private String name ;
57 private List<Student> allStudents ;//一个学校有多个学生
58 public School(String name){
59 this.allStudents = new ArrayList<Student>();
60 this.setName(name) ;
61 }
62 public void setName(String name){
63 this.name = name ;
64 }
65 public String getName(){
66 return this.name;
67 }
68 public List<Student> getAllStudents(){//取得全部的学生
69 return this.allStudents ;
70 }
71 public String toString(){
72 return "学校名称:" + this.name ;
73 }
74 }
其实多对一和一对多只是站的角度的不同,但是确实也是表示的关系就是一个是一方一个是多方。
如果写单项的其实他们干的一个事情,就是对表的操作是一样的,只是如果你写一对多,那么在student那方他没法查看一个学生的school是什么,如果你只写多对一,不写school中的set属性,那么你就没法查看一个学校有多少个学生。但是他们都实现了表的连接,就是外键的作用。表示了两个表之间的关系。
我这里不贴代码,只是简单写下他们的区别,想看代码请参考:
代码参考:https://www.cnblogs.com/xscn/archive/2013/08/09/3249274.html