Hibernate----- 理解多对一和一对多。

开始我不理解下面代码的写法和不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 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 allStudents ;//一个学校有多个学生  
58     public School(String name){
59         this.allStudents = new ArrayList(); 
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 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

你可能感兴趣的:(数据库,java)