درس اليوم رح نوصل الـ Department مع الـ Employee. مثل ما شايفين بالـ Diagram، العلاقة هي One-to-Many: قسم واحد عنده كثير موظفين.
@Entity
@Table(name = "department")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Department {
@Id
@GeneratedValue
@UuidGenerator
private UUID id;
@Column(name = "name", nullable = false, unique = true, length = 100)
private
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
name لازم يكون unique = true - ما بنحتاج قسمين بنفس الاسمnullable = false - اسم القسم إلزامي دائماًبعد ما تضيف الـ Annotation @Entity، Spring Boot ينشئ جدول department تلقائياً. تأكد إنك حاطط ddl-auto=create وبعدين ارجع لـ none.
رح ننشئ نفس الطبقات اللي عملناها للـ Employee:
@Repository
public interface DepartmentRepository extends JpaRepository<Department, UUID> {
}public interface DepartmentService {
List<Department> findAll();
Department findOne(UUID departmentId);
Department create(Department department);
void deleteOne(UUID departmentId);
}@Service
public class DepartmentServiceImpl implements DepartmentService {
@Autowired
private DepartmentRepository departmentRepository;
@Override
public List<Department> findAll() {
return departmentRepository.findAll();
}
@Override
public Department findOne(UUID departmentId) {
return departmentRepository.findById(departmentId)
.orElseThrow(() -> CustomResponseException.resourceNotFound(
"Department with ID " + departmentId + " not found"
));
}
@Override
public Department create(Department department) {
return departmentRepository.save(department);
}
@Override
public void deleteOne(UUID departmentId) {
Department department = findOne(departmentId);
departmentRepository.deleteById(department.getId());
}
}@RestController
@RequestMapping("/departments")
public class DepartmentController {
private final DepartmentService departmentService;
public DepartmentController(DepartmentService departmentService) {
this.departmentService = departmentService;
}
@GetMapping
public ResponseEntity<GlobalResponse<List<Department>>> findAll() {
return new ResponseEntity<>(
new GlobalResponse<>(departmentService.findAll()), HttpStatus.OK
);
}
@PostMapping
public ResponseEntity<GlobalResponse<Department>> create(
@RequestBody Department department) {
return new ResponseEntity<>(
new GlobalResponse<>(departmentService.create(department)), HttpStatus.CREATED
);
}
@DeleteMapping("/{departmentId}")
public ResponseEntity<Void> delete(@PathVariable UUID departmentId) {
departmentService.deleteOne(departmentId);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}بعد ما أنشأنا الـ Department Entity والجدول تاعتها، لازم نربطها مع الـ Employee.
بالـ Employee Entity، بنستبدل departmentId بعلاقة حقيقية:
@Entity
@Table(name = "employee")
public class Employee {
// ... باقي الخصائص
@ManyToOne
@JoinColumn(name = "department_id", nullable = true)
private Department department;
}@ManyToOne - يعني كثير Employees لـ Department واحد@JoinColumn(name = "department_id") - يحدد اسم العمود اللي فيه الـ Foreign Keyبالعلاقة One-to-Many:
@ManyToOne - كثير موظفين لقسم واحد@OneToMany للوصول لموظفيه@Entity
@Table(name = "department")
public class Department {
@Id
@GeneratedValue
@UuidGenerator
private UUID id;
@Column(name = "name", nullable = false, unique = true)
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
}الـ mappedBy = "department" يشير لاسم الـ Field بالـ Employee اللي يمثل العلاقة.
| Annotation | المعنى |
|---|---|
@ManyToOne | كثير Employees لـ Department واحد |
@OneToMany | Department عنده كثير Employees |
@JoinColumn | يحدد عمود الـ Foreign Key بالجدول |
mappedBy | يشير للطرف المالك للعلاقة |
بالدرس الجاي رح نكمل على علاقات ثانية مثل Leave Requests.