java 一对多、多对多关系示例

简介: java 一对多、多对多关系示例

一对多


生活中常见一对多关系的例子,如一个老师教多个学生,一个学生属于一个老师,那么这就是一个典型的一对多关系,可以通过集合进行关系的表示。


定义一个学生类

public class Student {
    private Integer id;
    private String name;
    private byte age;
    private Teacher teacher;
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    public Student(Integer id, String name, byte age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public byte getAge() {
        return age;
    }
    public void setAge(byte age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +'}';
    }
}
在以上的 Student 类中包含了一个 Teacher 属性,表示一个学生属于一个老师。在程序运行时,只需要传入 Teacher 类的引用就可以完成这样的关系。

定义一个老师类

import java.util.HashSet;
public class Teacher {
    private Integer id;
    private String name;
    private byte sex;
    private HashSet<Student> students = new HashSet<>();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public byte getSex() {
        return sex;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", students=" + students +
                '}';
    }
    public Teacher(Integer id, String name, byte sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
    public void setSex(byte sex) {
        this.sex = sex;
    }
    public HashSet<Student> getStudents() {
        return students;
    }
    public void setStudents(HashSet<Student> students) {
        this.students = students;
    }
}

逻辑关系

//一对多
public class OneToManyDemo {
    public static void main(String[] args) {
        Student heyi1 = new Student(1, "heyi1", (byte) 2);
        Student heyi2 = new Student(2, "heyi2", (byte) 4);
        Teacher teacher = new Teacher(1, "heyi老师", (byte) 12);
        HashSet<Student> students = teacher.getStudents();
        students.add(heyi1);
        students.add(heyi2);
        heyi2.setTeacher(teacher);
        heyi1.setTeacher(teacher);
        print(teacher);
    }
    private static void print(Teacher t){
        System.out.println(t.getName());
        for (Student s: t.getStudents()) {
            System.out.println(s);
        }
    }
}

多对多


使用集合不仅可以表示一对一的关系,也可以表示多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。


要完成上面要求,首先应该定义两个类,分别是学生信息(Student)类、课程信息(Course)类。在学生类中存在一个集合,保存全部的课程。同样,在课程类中也要存在一个集合,保存全部的学生。


定义学生类

package model.vo;
import java.util.HashSet;
public class Student {
    private Integer id;
    private String name;
    private byte age;
    private Teacher teacher;
    private HashSet<Course> allCourse = new HashSet<Course>();
    public HashSet<Course> getAllCourse() {
        return allCourse;
    }
    public void setAllCourse(HashSet<Course> allCourse) {
        this.allCourse = allCourse;
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    public Student(Integer id, String name, byte age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public byte getAge() {
        return age;
    }
    public void setAge(byte age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +'}';
    }
}

定义课程类

package model.vo;
import java.util.HashSet;
public class Course {
    private int id;
    //课程名称
    private String name;
    private HashSet<Student> allStudents = new HashSet<>();
    public Course(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public 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 HashSet<Student> getAllStudents() {
        return allStudents;
    }
    public void setAllStudents(HashSet<Student> allStudents) {
        this.allStudents = allStudents;
    }
    @Override
    public String toString() {
        return "Course{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

逻辑关系

import model.vo.Course;
import model.vo.Student;
import model.vo.Teacher;
public class ManyToManyDemo {
    public static void main(String[] args) {
        Course c1 = new Course(3, "英语");
// 实例化课程对象
        Course c2 = new Course(5, "计算机");
        // 实例化课程对象
        Student s1 = new Student(1, "张三", (byte) 20);
// 实例化学生对象
        Student s2 = new Student(2, "李四", (byte) 21);
        Student s3 = new Student(3, "王五", (byte) 22);
        // 向课程增加学生信息
        c1.getAllStudents().add(s1);
        c1.getAllStudents().add(s2);
        // 向学生信息增加课程
        s1.getAllCourse().add(c1);
        s1.getAllCourse().add(c2);
        coursePrint(c1);
        studentPrint(s1);
    }
    private static void coursePrint(Course course) {
        System.out.println(course.getName());
        for (Student s : course.getAllStudents()) {
            System.out.println(s);
        }
    }
    private static void studentPrint(Student student) {
        System.out.println(student.getName());
        for (Course course : student.getAllCourse()) {
            System.out.println(course);
        }
    }
}
相关文章
|
6天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
25天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
3月前
|
存储 Java API
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
44 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
1月前
|
Java API 网络安全
Java 发送邮件示例
本示例展示了如何使用Java编程语言发送电子邮件。通过利用JavaMail API,这段代码实现了从配置SMTP服务器,设置邮件属性,到发送邮件的全过程,为开发者提供了实用的参考。
|
2月前
|
JavaScript 前端开发 Java
Java 8 新特性详解及应用示例
Java 8 新特性详解及应用示例
|
3月前
|
设计模式 存储 Java
掌握Java设计模式的23种武器(全):深入解析与实战示例
掌握Java设计模式的23种武器(全):深入解析与实战示例
|
3月前
|
消息中间件 负载均衡 Java
"深入Kafka核心:探索高效灵活的Consumer机制,以Java示例展示数据流的优雅消费之道"
【8月更文挑战第10天】在大数据领域,Apache Kafka凭借其出色的性能成为消息传递与流处理的首选工具。Kafka Consumer作为关键组件,负责优雅地从集群中提取并处理数据。它支持消息的负载均衡与容错,通过Consumer Group实现消息的水平扩展。下面通过一个Java示例展示如何启动Consumer并消费数据,同时体现了Kafka Consumer设计的灵活性与高效性,使其成为复杂消费场景的理想选择。
121 4