묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 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
자식 엔티티로의 영속성 전이에 대해서 질문 있습니다.
먼저 다음과 같이 부모 자식 엔티티가 있습니다. @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를 따로 만들면 데이터가 불일치할 수 있는 통로가 생긴다고 생각해서 안 만들었었습니다.