inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

174만명의 커뮤니티!! 함께 토론해봐요.

영속성 전이 질문

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

다음은 강의와 실습을 통해 얻은 지식입니다. - 부모위주로 개발을 진행하고 싶을 때 영속성전이 사용 - @ManyToOne 또는 @OneToMany 의 속성에 Cascade 속성을 넣는다고 해서 DB 테이블생성쿼리에 별도의 설정이 추가되는 것은 아님 - 즉, 어플리케이션측 설정이라 설정 덕분에 연관된 자식 엔티티에 대한 저장, 삭제쿼리가 추가적으로 질의됨(부모엔티티에 대한 쿼리와 함께). 질문1. FK 생성시 on update/delete 옵션이 있습니다.(https://h5bak.tistory.com/125 ) 영속성전이를 공부하면서 jpa의 cascade속성명과 유사한 TABLE FK의 on update/delete 옵션기능을 알게됐습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE `member` ( `member_id` BIGINT( 20 ) NOT NULL , `username` VARCHAR ( 255 ) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci' , `team_id` BIGINT( 20 ) NULL DEFAULT NULL , PRIMARY KEY ( `member_id` ) USING BTREE, INDEX `FKcjte2jn9pvo9ud2hyfgwcja0k` ( `team_id` ) USING BTREE, CONSTRAINT `FKcjte2jn9pvo9ud2hyfgwcja0k` FOREIGN KEY ( `team_id` ) REFERENCES `AAA` . `team` ( `team_id` ) ON UPDATE RESTRICT ON DELETE RESTRICT ) ; Colored by Color Scripter cs ON UPDATE / ON DELETE 외래키 옵션으로는 restrict / cascade / set null / no action 이 있습니다. 위 옵션들은 외래키를 갖는 다쪽(자식쪽)에 설정할 수 있는 옵션입니다. 위 4가지 옵션을 JPA 어노테이션으로 셋팅이 가능한지 궁금합니다. 질문2. 책과 강의에서는 영속성전이에 대해서 @OneToMany위주로 설명이 진행됐습니다. 저는 책 p.173상단표에 있듯 @ManyToOne에 cascade속성을 이용해보는 방식도 궁금해졌습니다. 하지만 이내 "특정 자식객체A를 삭제했다고 부모객체를 삭제하면 같은 부모를 둔 다른 자식객체B,C,D 입장에서 말이 안되는 상황" 이라고 생각이 들었습니다. @OneToMany의 cascade속성을 실습하려면 자식, 부모의 상황을 어떻게 고려해야하는지 조언을 구하고 싶습니다.

  • 영속성전이
  • JPA
  • java
창신동 장첸 댓글 1 좋아요 2 조회수 177

자식 엔티티로의 영속성 전이에 대해서 질문 있습니다.

미해결

실전! 스프링 데이터 JPA

먼저 다음과 같이 부모 자식 엔티티가 있습니다. @Entity public class Leaf { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "tree_id", referencedColumnName = "id") private Tree tree; } @Entity public class Tree { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "tree", cascade = CascadeType.ALL, orphanRemoval = true) private List<Leaf> leaves = new ArrayList<>(); } Tree 엔티티는 부모이고 TreeRepository가 있는 상태입니다. Leaf 엔티티는 자식이고 Tree에 완전히 종속된다고 생각하여 Repository를 안 만들었습니다. 이 때, 비영속된 Tree에 Leaf를 추가하고 save를 시키면 영속성 전이로 인해서 Leaf들까지 전부 다 insert 되는 것은 확인하였습니다. 여기서 질문은 이미 영속화가 되어 있는 Tree를 findById() 로 찾아온 다음에 연관관계를 매핑한 새로운 Leaf를 리스트에 추가하면 insert가 되지 않았습니다. (얄팍한 지식으로 더티체킹처럼 list에 새로운 Leaf가 추가되었네? -> insert 이렇게 될 줄 알았습니다.) 여기서 Leaf를 추가하려면 LeafRepository를 따로 만들어야 할까요?? 저는 Leaf가 Tree에 완전히 종속되는 엔티티인데 Tree를 통하지 않고 Repository를 따로 만들면 데이터가 불일치할 수 있는 통로가 생긴다고 생각해서 안 만들었었습니다.

  • 영속성전이
  • spring-boot
  • java
  • JPA
  • spring
댓글 2 좋아요 0 조회수 346

인기 태그

인프런 TOP Writers

주간 인기글