연관 관계 |
@ManyToOne 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원 매니투원
1. @OneToMany 는 @ManyToOne(fetch = FetchType.LAZY) 가 없으면 존재할 수 없다.
2. @ManyToOne(fetch = FetchType.LAZY) 는 개수가 더 많은 놈에게 건다.
3. N : M 은 중간 테이블이 필요하다. (리스트를 필드에 선언할 수 없기 때문에)
⇒ 중간 테이블에 @ManyToOne(fetch = FetchType.LAZY) 를 2번 선언
* cascade : 부모 지웠더니 자식까지 다 지워버리는 놈 ⇒ 실무에서 엄청나게 위험한 일
@OneToMany(mappedBy = ... , cascade , orphanRemoval) : 정말 위험하기 때문에 쓰면 안된다.
@ManyToMany
⇒ 내부적으로 중간 테이블을 만든다.
⇒ 우리가 이 중간 테이블을 파악할 수가 없다.
⇒ 자동으로 중간 테이블이 생성되어 버리니까 여기서 어떤 오류가 발생했을 때 대처하기가 굉장히 곤란하다.
[1] 무조건 @ManyToOne 부터
[2] @ManyToOne 은 Board에 붙어야할까? Comment에 붙어야할까?
⇒ 무조건 많은 쪽에 붙어야 한다. Board 보다 Comment가 많기 때문에 Comment에 @ManyToOne이 붙어야 한다.
[3] @ManyToOne과 (fetch = FetchType.LAZY) 는 세트다.
[4] @JoinColumn(name = "board_id")
⇒ @JoinColumn 과 (name = "*****_id) 는 세트다.
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id", nullable = false) (nullable = false : null 이면 안되도록 설정) private Board board; 생성자에 Board board 와 this.board = board; 를 추가 |
@Getter
@Entity
@NoArgsConstructor
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String contents;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "boardId", nullable = false)
private Board board;
public Comment(String contents, Board board) {
this.contents = contents;
this.board = board;
}
}
CommentService에서 private final BoardRepository boardRepository; boardRepository.findById(boardId).orElseThrow(() -> new NullPointerException("보드 없음 수고!")); Comment 생성자에 Board board 추가 |
@Service
@RequiredArgsConstructor
public class CommentService {
private final BoardRepository boardRepository;
private final CommentRepository commentRepository;
@Transactional
public CommentSaveResponseDto saveComment(
Long boardId, CommentSaveRequestDto commentSaveRequestDto){
boardRepository.findById(boardId).orElseThrow(
() -> new NullPointerException("보드 없음 수고!"));
Comment comment = Comment(
commentSaveRequestDto.getUsername(), commentSaveRequestDto.getContents(),
Board board);
commentRepository.save(comment);
return new CommentSaveResponseDto(
comment.getCommentId(),
comment.getUsername(),
comment.getContents(),
comment.getCreatedAt(),
comment.getModifiedAt()
);
}
}