# cascade
Raw JPA 기타 기능 (Cascade, orphanRemoval, Fetch)
Cascade (영속성 전이) 사용 위치 연관관계의 주인 반대편 - 부모 엔티티(다대일에서 일) 즉, @OneToMany 가 있는 쪽 또는 @OneToOne 도 가능 예를들어, 게시글과 첨부파일이라면 일에 해당하는 게시글에 설정한다. 사용 조건 양쪽 엔티티의 라이프사이클이 동일하거나 비슷해야한다. 예를들어, 게시글이 삭제되면 첨부파일도 같이 삭제 되어야 한다. 대상 엔티티로의 영속성 전이는 현재 엔티티에서만 전이 되어야 한다. (다른곳에서 또 걸면 안됨) 예를들어, 첨부파일을 게시글이 아닌 다른곳에서 영속성 전이를 하면 안된다. -> 중복이 안된다. 옵션 종류 ALL : 전체 상태 전이 PERSIST : 저장 상태 전이 REMOVE : 삭제 상태 전이 MERGE : 업데이트 상태 전이

jpa - 부모와 자식객체를 동시 persist()할 때 cascade 설정
부모 객체 생성 동시에 자식 객체 생성 후 save 시 자식객체 생성 안되는 현상을 발견했다. 부모 객체에 자식 객체를 OneToMany로 매핑하여 부모 객체 생성 시 자식객체까지 생성하여 서로 매핑되도록 구성하였다. 이때, 단순 insert하는 행위라 생각하여 영속성 전이 상태 값을 PERSIST로 설정하였다. 일단 다음과 같이 class를 구성하였다. Parent.java Child.java TestService.java test code 수행 시 로그를 보면 부모 객체는 정상적으로 insert 되는 것으로 보인다. 하지만 자식 객체는 정상적으로 부모의 fk와 매핑 했던 값이 제대로 들어가지 않으면서 정상적인 insert가 수행되지 않는 것이 확인된다. 왜그럴까?.. 둘다 insert를 하는 행위이기 때문에 cascade 설정은 persist로 했는데.. 너무 궁금했다. 그래서 내부를 한번 살펴보기로 했다. 먼저 JpaRepository를 구현한

[Spring] Cascade(영속성 전이), orphanRemoval
Cascade(영속성 전이) > 👀 영속성 전이란? 영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황 | 옵션 | 정보 | | - | - | |CascadeType.ALL|모두 적용| |CascadeType.PERSIST|영속| |CascadeType.MERGE|병합| |CascadeType.REMOVE|삭제| |CascadeType.REFRESH|REFRESH| |CascadeType.DETACH|DETACH| 영속성 상태 저장(CascadeType.PERSIST) 음식 테이블과 고객 테이블이 N : 1 양방향 관계라 가정후 고객 ‘Robbie’가 후라이드 치킨과 양념 치킨을 주문해보겠다. Robbie가 음식을 주문하기 위해서는 위 처럼 user, food, food2 모두 save() 메서드를 3번 호출하면서 영속화해야한다. JPA에서는 이를 간편하게 처리할 수 있는 방법으로 영속성 전이(CASCADE)의 PERS
[Spring] could not execute statement; SQL [n/a]; constraint [null]
문제상황 1 org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null] 게시글을 삭제하려고 하면 오류 발생 게시글 삭제 원인 DB에서 chatroom이 post를 외래키(postid)로 참조하고 있는데, 이때 게시글을 삭제하려고 하니 constraint 제약이 걸려있어 chat_room에서 삭제를 막고있다. 해결 @OneToMany 어노테이션 안에 cascade = CascadeType.ALL 속성을 추가 기존 코드 수정 후 문제상황 2 비슷하게 이번에는 DB에서 chatcontent가 chatroom를 외래키(chatroomid)로 참조하고 있는데, 이때 게시글을 삭제하려고 하니 constraint 제약이 걸려있어 chatcontent에서

TIL - 값 전달 오류 | 데이터 Insert | Cascade
문제1 - 받아야 하는 값을 전달하지 않았을 경우 1) 문제 postman에서 발생한 오류다. 아래는 Intellij에서 읽은 내용이다. ` 2) 시도 오류 내용을 읽어보면, name이라는 값의 파라미터 값이 요청되는데, 그 값이 나타나지 않았다는 의미인 것 같았다. 3) 해결 이는 @RequestParam 뒤에 (required = false)를 붙여서 해결이 가능하다. 원래는 required 값이 true가 default지만 false로 변경하면 클라이언트에서 전달받은 값에 해당 값이 포함되지 않아도 즉, 위와 같은 문제가 발생해도 오류는 발생하지 않는다. @PathVariable에도 존재한다. 다만 입력하지 않은 값은 null로 초기화가 가능하다. 4)
CASCADE (영속성 전이)
객체A를 persist할 때, 그와 관련된 객체B도 한번에 persist하고 싶을 때 (cascade = CascadeType.All)로 세팅해준다. 영속성 컨텍스트에 올릴 때, 객체마다 일일이 persist해주기에 번거로워지니까 한번에 persist해주는 방법이다. 주의 : 객체B가 또다른 객체와 연관이 되어있다면 사용하면 안된다. 고아 객체 >orphanRemoval = true로 설정해주면 부모 객체가 삭제되었을 때, 자식 객체도 자동으로 삭제가 된다. 특정 엔티티가 개인 소유할 때만 사용하도록 하자 CascadeType.ALL + orphanRemovel=true 로 설정하면 부모 엔티티가 자식 엔티티의 생명 주기를 완전 관리할 수 있게 된다.
"org.hibernate.TransientPropertyValueException: object references an unsaved transient instance 오류
오류 사항 컨트롤러에서 요청 메시지 바디에 있는 정보를 통해 엔티티 컬럼을 추가하는 과정에서 다음 오류가 발생했다. 컨트롤러에서 호출된 메소드와 요청 메시지 바디에 담긴 정보는 다음과 같다. 컨트롤러에서 호출된 메소드 요청 메시지 바디 여기서 사용되는 엔티티들은 다음과 같다. StudyCafe 엔티티 Owner 엔티티와 다대일 관계이다. FK를 가진다. Owner 엔티티 StudyCafe 엔티티와 일대다 관계이다. 원인 일대다 연관관계를 맺고 있는 두 엔티티 중 FK를 가지고 있는 엔티티(StudyCafe)를 추가할 때 Owner 엔티티가 먼저 추가가 된 후 StudyCafe 를 추가해야 하는데 StudyCafe 를 먼저 추가하여 오류가 발생한 것이다. 요악하면 PK를 가진 엔티티를 먼저 생성한 후 FK를 가진 엔티티를 생성 하여 PK를 통해 매핑을 해야하는데
[SQL] 테이블 생성/ 제약 조건/ 칼럼 추가/ 테이블 삭제
erd https://choiseungyoun.github.io/posts/what-is-erd/ SQL >구조적 쿼리 언어(SQL)는 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다. 관계형 데이터베이스는 정보를 표 형식으로 저장하며, 행과 열은 다양한 데이터 속성과 데이터 값 간의 다양한 관계를 나타냅니다. SQL 문을 사용하여 데이터베이스에서 정보를 저장, 업데이트, 제거, 검색 및 검색할 수 있습니다. 데이터베이스 성능을 유지 관리하고 최적화하는 데 SQL을 사용할 수도 있습니다. > SQL은 어떻게 작동하나요? >>구조적 쿼리 언어(SQL) 구현에는 데이터베이스 쿼리를 처리하고 결과를 반환하는 서버 시스템이 필요합니다. SQL 프로세스는 다음을 포함한 여러 소프트웨어 구성 요소를 거칩니다. 오라클 > 오라클? >>오라클(Oracle Corporation)은 미국 텍사스에 본사를 둔 매출 규모 세계 2위의 소프트웨어 회사이

Chapter8. 프록시와 연관관계 관리
Proxy 지연 로딩 기능을 지원하는데 사용되는 가짜 객체 지연 로딩 기능을 구현하는 방법은 크게 2가지 프록시 객체를 사용하는 방법 바이트코드를 수정하는 방법 프록시 객체 조회 예시 코드 https://velog.velcdn.com/images/peanut_/post/7ba32fc0-8179-459b-b360-195be91c1e7f/image.png 프록시의 특징 프록시 객체는 처음 사용할 때 한 번만 초기화 ⚠️ 프록시 객체는 원본 엔티티를 상속받은 객체이므로, 타입 체크시 주의 영속성 컨텍스트에 찾는 엔티티가 이미 있으면, 데이터베이스를 조회할 필요가 없다. 따라서, em.getReference(...) 를 호출해도 프록시가
2023.02.08.WED
[JMT 커피 주문 시스템 - 게시판 만들기] 클래스 내부 필드로 제네릭 T 사용할 때는, 클래스명 옆에 선언해줘야 함. https://seeminglyjs.tistory.com/184 @Mapping에서 attribute로 expression을 사용하여, 함수 반환 값을 매핑하는 방법 https://stackoverflow.com/questions/66204915/how-to-map-java-collection-to-its-size could not prepare statement 에러 어쩐지, H2 DB에 테이블 하나가 안 만들어지고 요청 보내면 에러나더라니, 예약어(Like)를 테이블명(엔티티)으로 사용해서 그런 것이었다. https://conservative-vector.tistory.com/entry/Spring-SQLGrammarException-could-not-prepare-statement 순환참조 잼

영속성 전이, 고아 제거 (Cascade, Orphan Removal)
Cascade (영속성 전이) 영속성 전이를 통해 하나의 Entity가 생성, 업데이트 될 때 하위 Entity도 같이 생성, 업데이트 해주는 방법이다. Cascade PERSIST, REMOVE 상위 엔티티가 영속 처리될 때 하위 엔티티들도 같이 영속 처리 MERGE, REFRESH, DETACH 상위 엔티티의 상태가 변경될 때 하위 엔티티들도 같이 상태 변경 All 상위 엔티티의 모든 상태 변경이 하위 엔티티에 적용 Spring Cascade Type CascadeType.ALL 모든 Cascade를 적용 CascadeType.PERSIST 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지 CascadeType.MERGE 엔티티 상태를 병합(Merge)할 때, 연관된 엔티티도 모두 병합 CascadeType.REMOVE 엔티티를 제거할 때, 연관된 엔티티도 모두 제거
[CSS in Depth] 1. Cascade, specificity and inheritance
1. Cascade, specificity and inheritance 1.1 Cascade 2개 이상의 각기 다른 css 문법을 동일한 요소에 선언할 경우 conflicting declarations(선언한 내용이 서로 충돌함)이 생길 수 있다. 위와같이 `` 태그를 각기 아래와 같이 선택하여 css를 선언했을 때 결과적으로 어떤 선언이 이기게 될까? 1) `` 2) #page-title 3) class: title 정답은 2번 id선택자로 선언한 내용이 최종 적용된다 cascade 개념을 파헤쳐보자. 각기 다른 선언이 충돌했을 때 3가지 측면을 비교하게 된다. 1) Stylesheet origin: styles의 출처.
JPA CASCADE
CascadeType.PERSIST Parent가 저장될 때 Children도 함께 저장 주의 사항 CascadeType.REMOVE Parent 삭제 시 Children도 삭제 Orphan removal = true Children이 Parent에서 분리되는 경우(고아 상태) Children 삭제 CascadeType.REMOVE & Orphan removal = true 주의 사항 delete query는 children마다 따로 따로 발생한다. cascade는 언제 사용해야 하나? Cascade되는 엔티티와
[JPA] 영속성 컨텍스트, Cascade 옵션
Cascade Cascade 옵션은 엔티티의 상태 변화를 전파시키는 옵션이다. 따라서 OneToMany 관계나 ManyToOne 관계를 맺는 엔티티의 상태 변화를 전이시킬 때 사용이 가능하다. 이게 무슨말일까?? 영속성에 대한 개념과 DB 커넥션에 대해 알지 못하면 이해하기 어렵다. 엔티티의 상태 엔티티들은 크게 네 가지 상태를 갖는다. 아래 그림은 엔티티들이 갖는 상태 변화를 그림으로 나타낸 것이다. Transient : 순수한 객체 상태를 갖고 있다. 영속성 컨텍스트에 포함되지 않았다. Persistent : save()가 호출되면 이는 Persistent, 즉 영속 상태가 된다. 이제 영속성 컨텍스트가 해당 엔티티를 관리하게 된다. 1차 캐시, 이를 Spring에서는 영속성

[스프링부트와 JPA활용1] - 엔티티 클래스 개발
주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 주문상품이라는 엔티티를 추가해서 다대다 관계를 이대다, 다대일 관계로 풀어냈다. 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다. > 참고: 외래 키가 있는 곳을 연관관계의 주인으로 정해라. > 연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 안된다.. 예를 들어서 자동차와 바퀴가 있으면,

[JPA] 영속성 전이 (CASCADE)
영속성 전이 (CASCADE) 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속화하고 싶을 때 사용하는 옵션 ex) 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장 부모 엔티티) 자식 엔티티) CASCADE 옵션을 키지 않고, 엔티티를 저장할 때) parent, child 엔티티를 일일이 저장해주어야 한다는 번거로움이 있다 CASCADE 옵션으로 부모 엔티티를 저장할 때, 연관된 자식 엔티티도 함께 저장되도록 할 수 있다 부모 엔티티에서 cascade 옵션을 켜준다. 부모 엔티티만 저장할 때, 연관된 자식 엔티티도 함께 저장된다. 부모 엔티티만 persist했는 데, 자식 엔티티도 함께 저장된다.

[sequelize] 시퀄라이즈 이번엔 진짜 정복?
저번주 미니프로젝트 때부터 있어왔던 트러블 슈팅을 순서대로 정리해본다. 미니프로젝트 때 외래키 관계 성공했던 방법 이런 식으로 1 대 다 관계인 두 모델에 hasMay, belongsTo를 적고 그 안에 foreingKey, sourceKey, targetKey, onUdate, onDelete를 적어주면 모든게 다 완벽히 테이블에 적용되어 생성됬었다. models/index.js파일은 건들지 않아도 됐고, migration 파일에도 딱히 관계에 관해서는 작성하지 않았었다. 나는 내가 작성한게 잘 먹혔는지를 워크벤치에 자동으로 외래키나 cascade가 적용됐는지 여부로 확인하였다. 클론 주차 새 프로젝트에서는 저 방법으로 외래키 생성이 안되는 문제 발생 성공했을 때 그 방법을 잘 정리해뒀고 그대로 따라했건만 제대로 되지 않았다. 그래서 하루 종일 찾아서 외래키를 적용시키는데 성공하는 두 가지 방법을 찾아내었다. 첫번째 방법 이와 같이 새 마이그레이션 파일을 만들
[JPA] 영속성 전이
영속성 전이 영속성 전이란, 특정 엔티티의 영속 상태를 변경할때 연관관계인 엔티티의 영속 상태도 동일한 상태로 변경시켜주는 것을 말한다. JPA에서는 부모 엔티티를 영속상태로 변경하면 자식 엔티티도 영속상태로 변경해주는 기술을 제공하는데 이를 영속성 전이(CASCADE)라고 한다. 종류 CascadeType.ALL : 모두 적용 CascadeType.PERSIST : 영속 CascadeType.MERGE : 병합 -영속성 컨텍스트에 저장되어 있는 엔티티를 수정했을 때 persist가 아닌 merge발생 CascadeType.REMOVE : 삭제 CascadeType.REFRESH : REFRESH CascadeType.DETACH : DETACH 이 중 가장 많이 사용되는 Persist와 Remove를 알아보자. 저장(Persist) Persist는 엔티티를 영속상태로 변경해주
(spring) (자바 ORM 표준 JPA 프로그래밍 - 기본편_03)
바로 시작! Member 와 Team은 N:1 이다. Member를 가져와야 할 때 Team의 데이터도 같이 가져온다. 물론 Team 테이블도 사용할 때는 좋지만 사용하지 않을때는 낭비지 않을까? 그래서 JPA에서는 이것을 프록시, 지연로딩으로 잡는다고 한다. 프록시란? 실제 엔티티 객체 대신에 사용되는 객체이다. em.find() - 데이터베이스를 통해서 실제 엔티티 객체 조회. em.getReference() - 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회. DB에 쿼리가 안나가지만 객체는 주어지는 것. 아래 코드는 getReference() 하는 시점에서 쿼리를 쏘지 않는다. 이유는 getReference()를 사용하면 이 값이 사용되는 시점에서 쿼리를 쏘기 때문이다. 또한 두 번째 줄 .getId()에서도 쿼리를 쏘지 않는다. 이유는 첫 번째 줄에서 이미 파라미터로 getId()를 사용했기 때문이

CascadeType 적용
문제 상황 여행 계획을 저장하는 api를 구현하기 위해서 최초에 entity 설계를 Post, Days, Places로 나눠서 구상했습니다. 예를 들어 유저가 여행(Post) 중에 2일차(Days)에는 어느 장소들(Places)을 방문할 예정인지를 파악하기 위해 앞서 언급한 것 처럼 entity를 나눈 것입니다. 프론트에서 여행 계획 저장 정보가 들어오는 모습은 다음과 같았습니다. Request 이에 따라 가장 하위 엔티티인 places 부터 forEach문으로 돌려서 각 장소 정보를 저장하고 그 장소들의 상위 엔티티인 days가 마찬가지로 반복문을 돌며 1일차, 2일차 날짜를 저장했습니다. 마지막으로 이 모든 것이 save 됐을 때 post도 최종 수정이 되도록 코드를 짰습니다. 엔티티 구성(최초) 그리고 나서 실행을 시키고 테스트를 해봤는데 에러가 발생했습니다. org.hibernate.TransientProper