본문 바로가기

카테고리 없음

3-1 entity 마저 생성하기

1.board

package com.cos.blog.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
import java.sql.Timestamp;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {

    @Id //primary key
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false, length = 100)
    private String title;

    @Lob //대용량 데이터
    private String content; //섬머노트 라이브러리 사용하면 <html> 태그가 섞여서 디자인이 됨. => 데이터 크기 매우 큼

    @ColumnDefault("0")// user테이블의 디폴트 user 는 스트링이라 안에 작은따옴표 넣었지만 얘는 int라서 필요없
    private int count;//조회수


    @ManyToOne //many =Board, user =One 한명의 유저는 여러개의 게시글 쓸 수 있음
    @JoinColumn(name = "userId")
    private User user; // 작성자
    //db는 오브젝트를 사용할 수 없어서 보통 fk를 사용, int user 이렇게 사용하겠지만
    // jpa는 오브젝트 저장 가능함.

    @CreationTimestamp
    private Timestamp createDate;


}

잘 생겨있음

 

2.reply 

 

package com.cos.blog.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
import java.sql.Timestamp;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {
    @Id //primary key
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false, length = 200)
    private String content;

    @ManyToOne //하나의 게시글에는 여러개의 답변이 올 수 있다.
    @JoinColumn(name = "boardId")
    private Board board; //원글

    @ManyToOne //한명의 유저는 여러개의 답변을 쓸 수 있음
    @JoinColumn(name = "userId")
    private User user; // 작성자

    @CreationTimestamp
    private Timestamp createDate;
}

쿼리 한번에 실행 : ctrl shift enter
테이블 정보를 보면 fk가 두개 생겨있음

 

3. 연관관계(fk)의 주인

 

jpa를 사용하지 않는다면..

상세보기에 필요한 저 테이블들을 join해서 써야겠지만ㅁ

orm 방식은 board테이블만 select 하면 된다.

select * from Board where Id =1;

jpa는 내가 준 쿼리를 그대로 날리지 않고 자기가 알아서 join 을해서 들고옴!

board안에 user 오브젝트가 들어있으므로..

그럼 reply테이블 입장에서는 fk를 board로 들고오면 되지만, board입장에서의 reply는?

 

@ManyToOne : 기본 전략 LAZY

(fetch = FetchType.EAGER)
// fetch = FetchType.EAGER : 너가 board테이블을 셀렉트하면 user는 하나니까 바로 가져올꼐.

 

 

만약 댓글이 들어가면 바로 보이는게 아니라 "펼치기" 버튼이 있다면, eager전략 아닌 lazy전략 사용 가능

하지만 들어가자마자 바로 보이려면 EAGER 필요.

그러므로 board entity에 user와 reply는 eager전략으로 들고온다!