One-to-Many Update

Operasi update pada kasus relasi Classes dan Student, akan menggunakan methode merge() dan mekanisme Dirty Checking otomatis yang memungkinkan pembaruan data secara efisien tanpa harus menulis query SQL manual, sekaligus memastikan perubahan tersinkronisasi secara dua arah (bi-directional).
Pembahasan materi update ini akan dibahas dari sisi parrent(Classes) dan update dari sisi child(Student).
1️⃣ Entity Parrent: Classes.java
Ubah fetch type menjadi Lazy fetch = FetchType.LAZY:
@Entity
@Table(name = "classes")
public class Classes {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "class_name")
private String className;
@OneToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "teacher_id")
private Teacher teacher;
@OneToMany(
mappedBy = "classes",
fetch = FetchType.LAZY,
cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
List<Student> students = new ArrayList<>();
// Setter & Getter
}
2️⃣ Entity Child: Student.java
Sisi @ManyToOne secara default bersifat EAGER, pada kasus ini kita tidak perlu mengubahnya kecuali kita ingin menjadikannya LAZY.
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "class_id")
private Classes classes;
// Setter & Getter
}
3️⃣ Update Parrent Classes
🛢️ Repository / DAO
- Menambahkan method baru pada interface DAO dengan menambahkan method
updateClasses(Classes classes):
public interface SchoolDAO {
void saveClasses(Classes classes);
Classes findClassById(Integer id);
void deleteClassesById(Integer id);
Teacher findTeacherById(Integer id);
void deleteTeacherById(Integer id);
List<Student> findStudentByClassId(Integer id);
Classes findClassesByIdJoinFetch(Integer id);
void updateClasses(Classes classes);
}
- Implementasi DAO:
@Repository
public class SchoolDAOImpl implements SchoolDAO {
private EntityManager entityManager;
public SchoolDAOImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
@Transactional
public void updateClasses(Classes classes) {
entityManager.merge(classes);
}
// Implementasi method Lainnya
}