클래스 생성
Board.java
package com.lwj.blog.model;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private int id;
@Column(nullable = false, length = 100)
private String title;
@Lob // 대용량 데이터
private String content; // 섬머노트 라이브러리<html> 태그가 섞여서 디자인 됨.
@ColumnDefault("0") // 얘는 숫자형 이기 때문에 홑따옴표 필요없다.
private int count; // 조회수 , 기본값은 0
@ManyToOne(fetch = FetchType.EAGER) // 연관관계 설정 // Many = Board, User = One -> 한명은 여러개의 게시물을 쓸 수 있다.
// EAGER -> 항상 데이터를 가져온다. 즉 Board를 select 할 때 항상 USER 테이블 정보까지 함께 조회한다.
// LAZY -> 필요할때만 가져온다는 뜻.
@JoinColumn(name="userId") // foreignkey로 만든다. 필드값은 userId로 저장됨
private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
// mappedBy 연관관계의 주인이 아니다 (난 FK가 아니에요) DB에 칼럼을 만들지 마세요.
// "board"는 Reply 테이블의 board 필드명
// @JoinColumn(name = "replyId") // 이걸 적는다면 FK가 생기는데 단순히 join을 할 뿐이지 FK를 만들 필요는 없다.
// 게다가 여러개의 댓글이 있을경우 1,2,3,4.. 처럼 콤마로 구분돼어 들어간다. 1NF(1정규화)가 깨진다.
private List<Reply> reply; // 하나의 글에는 여러개의 댓글이 가능하기 때문에 List 로 가져와야된다.
@CreationTimestamp
private Timestamp createDate;
}
연관관계 주인
=> FK를 누가 가졌는지
메인페이지
글 제목 - Board
글 번호 - Board
상세페이지
작성자 - User
제목 - Board
내용 - Board
댓글 - Reply
ORM JPA 를 사용하기 전
메인페이지
SELECT * FROM BOARD;
상세페이지
SELECT * FROM BOARD
JOIN USER U ON (B.USERID = U.USERID)
JOIN REPLY R ON (B.BOARDNO = R.BOARDNO);
JPA 를 사용했을 경우
@ManyToOne(fetch = FetchType.EAGER) // 연관관계 설정 // Many = Board, User = One -> 한명은 여러개의 게시물을 쓸 수 있다.
// EAGER -> 항상 데이터를 가져온다. 즉 Board를 select 할 때 항상 USER 테이블 정보까지 함께 조회한다.
// LAZY -> 필요할때만 가져온다는 뜻.
@JoinColumn(name="userId") // foreignkey로 만든다. 필드값은 userId로 저장됨
private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다.
BOARD 객체가 위 코드와 같이 USER 오브젝트를 갖고 있기 때문에 자동으로 JPA가 DB에 BOARD테이블과 USER테이블을 JOIN한 쿼리를 날린다.
그러나 REPLY 정보는 없기 때문에 BOARD를 SELECT 를 했을 때 REPLY도 가져오게 하는 코드를 써야된다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
// mappedBy 연관관계의 주인이 아니다 (난 FK가 아니에요) DB에 칼럼을 만들지 마세요.
// "board"는 Reply 테이블의 board 필드명
// @JoinColumn(name = "replyId") // 이걸 적는다면 FK가 생기는데 단순히 join을 할 뿐이지 FK를 만들 필요는 없다.
// 게다가 여러개의 댓글이 있을경우 1,2,3,4.. 처럼 콤마로 구분돼어 들어간다. 1NF(1정규화)가 깨진다.
private List<Reply> reply; // 하나의 글에는 여러개의 댓글이 가능하기 때문에 List 로 가져와야된다.
@joinCoulmn을 쓰게 된다면 Board 테이블이 아래와 같이 생성된다.
replyId 에 콤마로 구분돼서 데이터가 들어간다.
1NF(제1정규화) 가 깨진다 -> DB에서는 하나의 컬럼에서는 하나의 원자값을 갖는다.