1313import org .runnect .server .common .exception .PermissionDeniedException ;
1414import org .runnect .server .common .module .convert .CoordinatePathConverter ;
1515import org .runnect .server .course .entity .Course ;
16+ import org .runnect .server .record .entity .Record ;
1617import org .runnect .server .course .repository .CourseRepository ;
1718import org .runnect .server .publicCourse .dto .request .CreatePublicCourseRequestDto ;
1819import org .runnect .server .publicCourse .dto .request .DeletePublicCoursesRequestDto ;
4344import org .springframework .stereotype .Service ;
4445import org .springframework .transaction .annotation .Transactional ;
4546
46- import javax .persistence .EntityManager ;
47- import javax .persistence .PersistenceContext ;
48-
4947@ Service
5048@ RequiredArgsConstructor
5149public class PublicCourseService {
@@ -58,9 +56,6 @@ public class PublicCourseService {
5856 private final ScrapRepository scrapRepository ;
5957 private final CourseRepository courseRepository ;
6058
61- @ PersistenceContext
62- private EntityManager entityManager ;
63-
6459
6560 @ Value ("${runnect.marathon-public-course-id}" )
6661 private void setMARATHON_PUBLIC_COURSE_IDS (String MARATHON_PUBLIC_COURSE_ID ) {
@@ -371,16 +366,16 @@ public DeletePublicCoursesResponseDto deletePublicCourses(
371366 //삭제전 course의 isPrivate update
372367 publicCourses .forEach (publicCourse -> publicCourse .getCourse ().retrieveCourse ());
373368
374- // Record의 publicCourse FK를 null로 설정 (Record 테이블 FK 제약조건 해제)
375- entityManager .createQuery (
376- "UPDATE Record r SET r.publicCourse = null WHERE r.publicCourse IN :publicCourses" )
377- .setParameter ("publicCourses" , publicCourses )
378- .executeUpdate ();
369+ // FK 제약 조건 해소: Record.public_course_id (NULLABLE) → null 처리
370+ publicCourses .forEach (publicCourse ->
371+ publicCourse .getRecords ().forEach (Record ::setPublicCourseNull )
372+ );
379373
380- // Scrap 삭제 (Scrap 테이블 FK NOT NULL 제약조건)
374+ // FK 제약 조건 해소: Scrap.public_course_id ( NOT NULL) → 행 삭제
381375 scrapRepository .deleteByPublicCourseIn (publicCourses );
382376
383- publicCourseRepository .deleteAllInBatch (publicCourses );
377+ // deleteAll: Hibernate ActionQueue가 UPDATE → DELETE 순서 보장
378+ publicCourseRepository .deleteAll (publicCourses );
384379
385380 return DeletePublicCoursesResponseDto .from (publicCourses .size ());
386381 }
0 commit comments