TIL 22.12.28

쓰옹·2022년 12월 28일
0

개발자를 향해~~TIL✍

목록 보기
51/87

TODAY


  • Blog 코드 발전시켰다.
    • 유효성 검사를 클래스를 만들어서 메서드로 뺐다
    • 관리자권한을 부여함 게시글이랑 댓글 수정과 삭제 관한거

에러에러에에러


왜지 에러가 발생했다

BlogController.java 필드에 private final AuthenticatedUser authenticatedUser 가 있어서 그런거였다. 이게 코드를 고치다가 적혀있어서 실행할 때 오류가 난 거였다. 사용하지 않는 코드라서 바로 지우니까 됐다..하핳 간단
빈에 등록이 안되어 있다고 나타난 에러인 듯 하다.

댓글 있는 게시물 삭제 시 에러 발생

2022-12-28T19:21:35.184+09:00 ERROR 13060 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : Referential integrity constraint violation: "FKKAP39F76WN135K7RU564FBJB7: PUBLIC.COMMENT FOREIGN KEY(BLOG_ID) REFERENCES PUBLIC.BLOG(ID) (CAST(1 AS BIGINT))"; SQL statement:
delete from blog where id=? [23503-214]
2022-12-28T19:21:35.186+09:00  INFO 13060 --- [nio-8080-exec-7] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements
2022-12-28T19:21:35.204+09:00 ERROR 13060 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKKAP39F76WN135K7RU564FBJB7: PUBLIC.COMMENT FOREIGN KEY(BLOG_ID) REFERENCES PUBLIC.BLOG(ID) (CAST(1 AS BIGINT))"; SQL statement:
delete from blog where id=? [23503-214]]] with root cause

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKKAP39F76WN135K7RU564FBJB7: PUBLIC.COMMENT FOREIGN KEY(BLOG_ID) REFERENCES PUBLIC.BLOG(ID) (CAST(1 AS BIGINT))"; SQL statement:
delete from blog where id=? [23503-214]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:508) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214]
    ...

PUBLIC.COMMENT FOREIGN KEY(BLOG_ID) REFERENCES PUBLIC.BLOG(ID)

  • 댓글이 FK로 블로그랑 연결되어 있어서 삭제를 할 때 DB 상에서 에러가 생기는 거였다.
    그래서 구글링!
  • ForeignKey 연관된 데이터 삭제
    방법이 두 가지가 나왔다.
    • orphanRemoval = true
    • 영속성 전이 특성 이용 - CascadeType.REMOVE

@OneToMany(mappedBy = "blog", orphanRemoval = true)

  • 부모 엔티티와 관계가 끊어진 자식 엔티티를 자동으로 삭제
  • 외래 키 제약 조건을 고려해서 자식을 먼저 삭제하고 부모를 삭제
  • 특정 엔티티가 개인 소유하는 엔티티에만 이 기능을 적용해야 함. 만약 삭제한 엔티티를 다른 곳에서도 참조한다면 문제가 발생할 수 있음
    • @OneToOne, @OneToMany에만 사용할 수 있음

@OneToMany(mappedBy = "BLOG", cascade = CascadeType.REMOVE)

  • cascade는 영속성 전이에 관한 옵션
  • 영속성 전이란 특정 엔티티를 영속성 상태로 만들 때 연관된 엔티티도 함께 영속성 상태로 변경한다는 것을 의미
    • 삭제 말고 다른 기능도 있음
      public enum CascadeType {
      		All,     // 모두 적용
      		PERSIST, // 영속
      		REMOVE,  // 삭제
      		MERGE,   // 병합
      		REFRESH, // REFRESH
      		DETACH,  // DETACH
      }

차이

  • orphanRemoval = true 는 연관된 엔티티 간의 참조가 끊어질 때 삭제가 이루어짐

  • cascade = CascadeType.REMOVE 는 부모 엔티티를 삭제하면 자식 엔티티를 삭제하는 것이지 참조가 끊어질 때 삭제가 이루어지는 것은 아님. 원래 엔티티가 삭제될 때 연관된 엔티티를 전부 삭제


그래서 cascade를 쓰니까 에러가 사라짐!


참조
https://khdscor.tistory.com/18
https://bcp0109.tistory.com/332

profile
기록하자기록해!

0개의 댓글