카테고리 없음

20240912Thu 🔗연관 관계

ddh1713 2024. 9. 12. 09:49
연관 관계

 

@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 boardthis.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()
			);
	}
	
}