인프런 커뮤니티 질문&답변

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

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

영속성 전이 질문

작성

·

132

2

다음은 강의와 실습을 통해 얻은 지식입니다.

- 부모위주로 개발을 진행하고 싶을 때 영속성전이 사용

- @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(20NOT NULL,
    `username` VARCHAR(255NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
    `team_id` BIGINT(20NULL 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
)
;
 
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속성을 실습하려면 자식, 부모의 상황을 어떻게 고려해야하는지 조언을 구하고 싶습니다.

 

 

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. ddoddo님

질문1

이 부분은 데이터베이스 마다 다를 것 같아요. 해당 데이터베이스 메뉴얼을 참고해주세요.

 

질문2

강의에서 강조한 것 처럼 단일 소유일때만 사용하셔야 합니다.

감사합니다.

선생님, 죄송하게도 질문2에 대해 오타가 있었습니다. @ManyToOne으로 정정하며 말씀드리고 싶습니다.

답변주신 내용도 @ManyToOne이라 간주를 하시고 작성하신건지요?

 

만약 선생님께서 @ManyToOne일 경우에도 단일소유일 때가 적절한 상황이라 말씀하신거라 가정하고 고민을 해봤습니다.

1
2
3
4
5
6
7
8
9
10
@Entity
public class Attach{
    
    @Id
    private Long id;
 
 
    @ManyToOne(cascade={CascadeType.ALL})
    private Post post;
}
cs

Attach(첨부파일) 1개는 Post(게시글) 한 곳에 단일소유가 되는데

첨부파일A,B,C가 있는 게시글J 에서 A파일을 지웠다고 글을 지워버리는 시도를 하면 문제가 발생할 것입니다. 첨부파일 테이블의 B, C레코드가  게시글테이블 J레코드를 외래키로 잡고 있기 때문에 J레코드를 삭제하려는 시도에 에러가 나기 때문입니다.

 

질문1에 대한 답변 감사드립니다!

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. ddoddo님

이렇게 복잡하게 되면 단일 소유 관계가 아닌 것으로 이해하시면 됩니다.

Attach -> Post의 관계는 단일 소유 관계가 성립하지 않습니다.

반대로 Post -> Attach는 단일 소유 관계가 성립할 수 있습니다.

감사합니다.

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

질문하기