java - 如何在数据库JAVA中建立两个对象之间的关系

标签 java database oop

我目前正在尝试在我的学生类(class)和我的学科类(class)之间创建关系。这就是我正在做的事情:

@服务 公共(public)类 StudentRegistrationService 实现 ApplicationRunner {

private final StudentRepository repository;
private final DisciplineRepository repository1;

public StudentRegistrationService(StudentRepository repository, DisciplineRepository repository1) {
    this.repository = repository;
    this.repository1 = repository1;
}

@Override
public void run(ApplicationArguments args) throws Exception {


    Scanner scanner = new Scanner(System.in);

    while (true) {
        String input = scanner.nextLine();
        String[] split = input.split(" ");

        String command = split[0];

        switch (command.toUpperCase()) {
            case "END":
                System.out.println("bye bye");
                return;
            case "STUDLIST":
                printAllStudents();
                break;
            case "STUDNEW":
                String[] studentDetails = Arrays.copyOfRange(split, 1, split.length);
                createNewStudent(studentDetails);
                break;
            case "DISCLIST":
                printAllDisciplines();
                break;
            case "DISCNEW":
                String[] disciplineDetails = Arrays.copyOfRange(split, 1, split.length);
                createNewDiscipline(disciplineDetails);
                break;
            case "STUDDISC":
                String[] studentAndDisciplineId = Arrays.copyOfRange(split, 1, split.length);
                studendAndDiscipline(studentAndDisciplineId);

                break;
            default:
                System.out.println("UNKNOWN command, try again!");
                break;
        }

    }

}


private void createNewDiscipline(String[] details) {
    int hours=Integer.parseInt(details[1]);
    repository1.save(new Discipline(details[0],hours));
}

private void printAllDisciplines() {

    Iterable<Discipline> allDisciplines = repository1.findAll();

    for (Discipline discipline : allDisciplines) {
        System.out.println(discipline);
    }
}

private void createNewStudent(String[] details) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy");
    LocalDate localDate = LocalDate.parse(details[1], dtf);
    repository.save(new Student(details[0],localDate));
}

private void printAllStudents() {

    Iterable<Student> allStudents = repository.findAll();

    for (Student student : allStudents) {
        System.out.println(student);
    }
}

private void studendAndDiscipline(String[] details) {
    int studentId=Integer.parseInt(details[1]);
    int disciplineId=Integer.parseInt(details[2]);
    Student student=repository.findById(studentId);
    Discipline discipline=repository1.findById(disciplineId);
    student.addDiscipline(discipline);
}

}

在studentAndDiscipline中,我必须通过ID在学生和学科之间创建关系,但我做错了。我尝试使用Optional<>,但它也不起作用。

我的学生类(class): @实体 类(class)学生{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;


private String name;
private LocalDate enrollmentDate;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<Discipline> disciplines;


private Student() {
    // Required by Hibernate
}
public Student(String name, LocalDate enrollmentDate) {
    this.name = name;
    this.enrollmentDate = enrollmentDate;
}

void addDiscipline(Discipline discipline) {
    this.disciplines.add(discipline);
}

@Override
public String toString() {
    return "Student{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", enrollmentDate=" + enrollmentDate +
            ", disciplines=" + disciplines +
            '}';
}

}

我的学科类(class): @实体 类(class)纪律{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;


String name;
int credits;

private Discipline() {
    // Required by Hibernate
}
public Discipline(String name, int credits) {
    this.name = name;
    this.credits = credits;
}

@Override
public String toString() {
    return "Discipline{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", credits=" + credits +
            '}';
}

}

我的学生存储库:

interface StudentRepository extends CrudRepository<Student, Integer> {

}

我的纪律存储库:

interface DisciplineRepository extends CrudRepository<Discipline, Integer> {

}

最佳答案

private void studendAndDiscipline(String[] details) {
    int studentId=Integer.parseInt(details[1]);
    int disciplineId=Integer.parseInt(details[2]);
    Student student=repository.findById(studentId);
    Discipline discipline=repository1.findById(disciplineId);
    student.addDiscipline(discipline);
}

Discipline discipline=repository1.findById(disciplineId); , 是不正确的。 findById(ID id)将返回Optional<T>类型,您需要使用get()得到T。 你应该确保纪律不为零。至少你需要检查一下

Student student=repository.findById(studentId).get();
Discipline discipline=repository1.findById(disciplineId).get();
if (discipline != null) {
    student.addDiscipline(discipline);
    System.out.println("Adding discipline to student.");
}

如果您确定纪律不为空,则需要检查 addDiscipline() 实现。

关于java - 如何在数据库JAVA中建立两个对象之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384684/

相关文章:

java - 从空类继承可以吗?

python - Pygame 中的关卡设计

c++ - 是否应该隐藏所有数据成员?

java - 在 switch 中使用关系运算符

java - 如何在 Spring 中继承 application.properties?

java - Android SQLite : Running the Same Query with Different Parameters Multiple Times Efficiently

php - MySQL 表 - ID 字段中存在较大间隙

java - Hibernate Criteria API - 使用一个数据库查询更新多行

java - 如何查找RollbackException的原因?

asp.net - 使用 ASP.net 在 MySql 中存储当前日期和时间