我有一Student堂課:
@Getter
@Setter
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private double gpa;
private int unitsPassed;
private int failures;
@ManyToOne
@JoinColumn(name = "classroom_id", nullable = false)
private Classroom classroom;
}
還有一個Classroom類:
@Getter
@Setter
@Entity
public class Classroom {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToMany(mappedBy = "classroom", cascade = CascadeType.ALL)
private List<Student> students;
public Student getBestStudent() {
Comparator<Student> comparator =
Comparator.comparing(Student::getGpa, Comparator.reverseOrder())
.thenComparing(Student::getUnitsPassed, Comparator.reverseOrder())
.thenComparing(Student::getFailures);
return students.stream().min(comparator).orElse(null);
}
}
由于某些操作原因,包含教室的表應該有一個外鍵參考教室中最好的學生的 id。最好的學生被確定為方法中列出的getBestStudent。我如何在課堂上添加一個欄位來代表最好的學生。課堂上的學生名單可以改變,因此最好的學生也可以改變。然后可以使用基于當前學生串列的同步服務來填充新欄位。
PS:我無法控制需要這個外鍵的系統。
uj5u.com熱心網友回復:
對我來說,這樣的要求更多是關于報告查詢,最好通過按需發出查詢來解決,而不是直接將結果存盤在表中。但如果你堅持這樣做,你可以簡單地將 映射best_student_id到Classroom:
@Entity
public class Classroom {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "best_student_id")
private Student bestStudent;
}
然后使用 OOP 封裝技術來強制執行這樣的邏輯,即每當一個學生被添加到教室或從教室中洗掉時,也會找到并更新該教室的最佳學生。
例如Classroom,添加方法來封裝添加和洗掉學生的邏輯:
@Entity
public class Classroom {
@OneToMany(mappedBy = "classroom", cascade = CascadeType.ALL)
private List<Student> students;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "best_student_id")
private Student bestStudent;
public void addStudent(Student student){
student.setClassroom(this);
this.students.add(student);
bestStudent = getBestStudent();
}
public void removeStudent(Student student){
this.students.remove(student);
bestStudent = getBestStudent();
}
public Student getBestStudent() {
Comparator<Student> comparator =
Comparator.comparing(Student::getGpa, Comparator.reverseOrder())
.thenComparing(Student::getUnitsPassed, Comparator.reverseOrder())
.thenComparing(Student::getFailures);
return students.stream().min(comparator).orElse(null);
}
}
注意:我洗掉@Getter/@Setter是Classroom因為我不希望有人通過直接設定或獲取學生串列來違反這種邏輯,以確保對教室學生串列所做的所有更改都必須通過這些方法完成。
另請注意,此方法需要將教室中的所有學生加載到記憶體中以計算最佳學生。所以如果一個教室里有很多學生,就會有表現和記憶問題。如果發生這種情況,您可以考慮撰寫查詢以找到最佳學生,并將此類邏輯封裝在服務層而不是物體層中。
我只是給你一個整體的想法。您必須自己微調代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414187.html
標籤:
