@Stateless
public class SchoolServiceBean implements SchoolServiceLocal {
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
// ================= STUDENTS =================
@Override
public Students createStudent(Students student) {
List courses = resolveCourses(student);
student.setCourses(courses);
courses.forEach(c -> c.getStudents().add(student));
em.persist(student);
return student;
}
@Override
public Students updateStudent(Students student) {
Students existing = em.find(Students.class, student.getStudentId());
if (existing == null) return null;
existing.setStudentName(student.getStudentName());
existing.setEmail(student.getEmail());
// Clear old relation
existing.getCourses().forEach(c -> c.getStudents().remove(existing));
existing.getCourses().clear();
// Add new relation
List updatedCourses = resolveCourses(student);
existing.getCourses().addAll(updatedCourses);
updatedCourses.forEach(c -> c.getStudents().add(existing));
return existing;
}
@Override
public void deleteStudent(Integer id) {
Students st = em.find(Students.class, id);
if (st != null) {
st.getCourses().forEach(c -> c.getStudents().remove(st));
st.getCourses().clear();
em.remove(st);
}
}
@Override
public Students findStudentById(Integer id) {
return em.find(Students.class, id);
}
@Override
public List findAllStudents() {
return em.createQuery("FROM Students", Students.class).getResultList();
}
// ================= COURSES =================
@Override
public Courses createCourse(Courses course) {
List students = resolveStudents(course);
course.setStudents(students);
students.forEach(s -> s.getCourses().add(course));
em.persist(course);
return course;
}
@Override
public Courses updateCourse(Courses course) {
Courses existing = em.find(Courses.class, course.getCourseId());
if (existing == null) return null;
existing.setCourseName(course.getCourseName());
existing.setCredits(course.getCredits());
existing.getStudents().forEach(s -> s.getCourses().remove(existing));
existing.getStudents().clear();
List updatedStudents = resolveStudents(course);
existing.getStudents().addAll(updatedStudents);
updatedStudents.forEach(s -> s.getCourses().add(existing));
return existing;
}
@Override
public void deleteCourse(Integer id) {
Courses c = em.find(Courses.class, id);
if (c != null) {
c.getStudents().forEach(s -> s.getCourses().remove(c));
c.getStudents().clear();
em.remove(c);
}
}
@Override
public Courses findCourseById(Integer id) {
return em.find(Courses.class, id);
}
@Override
public List findAllCourses() {
return em.createQuery("FROM Courses", Courses.class).getResultList();
}
// ===== Helper: Resolve collections =====
private List resolveCourses(Students student) {
return student.getCourses().stream()
.map(c -> em.find(Courses.class, c.getCourseId()))
.toList();
}
private List resolveStudents(Courses course) {
return course.getStudents().stream()
.map(s -> em.find(Students.class, s.getStudentId()))
.toList();
}
}