Project/Blog

Blog - 5. Model

고마우미 2022. 5. 23. 22:04

[Member]

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamicInsert //null 인값은 default value로 입력
@Entity	//User Class가 자동으로 Oracle에 생성
public class Member {
	
	@Id	//pk
	@GeneratedValue(strategy = GenerationType.IDENTITY) // project에 연결된 db의 넘버링 전략을 따라간다.
	private int id;	//sequnce //auto_increment
	
	@Column(nullable = false, length = 30, unique = true)
	private String username;	//user_id

	@Column(nullable = false, length = 100) // hash (비밀번호 암호화)
	private String password;	//user_pw
	
	@Column(nullable = false, length = 50) 
	private String email;		
	
	@ColumnDefault("'user'")	
	private String role;	//Enum을 쓰는게 좋음 //admin, user, manager
	
	@CreationTimestamp	//시간이 자동으로 입력
	private Timestamp createDate;
}

 

[Board]

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) // project에 연결된 db의 넘버링 전략을 따라간다.
	private int id;
	
	@Column(nullable = false, length = 100)
	private String title;
	
	@Lob
	private String content;	//섬머노트 라이브러리 <html> 태그가 섞여서 디자인이 됨
	
	@ColumnDefault("0")
	private int count;	//조회수
	
	@ManyToOne //Many=Board, User=One
	@JoinColumn(name="memberId")
	private Member member;	//DB는 object를 저장할 수 없다. FK, java는 object를 저장 할 수 있다.
	
	@OneToMany(mappedBy="board", fetch = FetchType.EAGER)	//mappedBy 연관관계의 주인이 아니다 (FK가 아니다) = DB에 Column을 만들지 않는다.
	private List<Reply> reply;
	
	@CreationTimestamp
	private Timestamp createDate;
	
}

 

[Reply]

package com.jinseong.blog.model;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

import org.hibernate.annotations.CreationTimestamp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {
	@Id
	@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="memberId")
	private Member member;
	
	@CreationTimestamp
	private Timestamp createDate;
}

 

[실행되는 SQL]

--Member
    create table Member (
       id number(10,0) generated as identity,
        createDate timestamp,
        email varchar2(50 char) not null,
        passwrod varchar2(100 char) not null,
        role varchar2(255 char) default 'user',
        username varchar2(30 char) not null,
        primary key (id)
    );

--Board
    create table Board (
       id number(10,0) generated as identity,
        content clob,
        count number(10,0) default 0 not null,
        createDate timestamp,
        title varchar2(100 char) not null,
        memberId number(10,0),
        primary key (id)
    );
    alter table Board 
       add constraint FKad83dxf0turt4s2e5ijeb4yup 
       foreign key (memberId) 
       references Member;

--Reply
    create table Reply (
       id number(10,0) generated as identity,
        content varchar2(200 char) not null,
        createDate timestamp,
        boardId number(10,0),
        memberId number(10,0),
        primary key (id)
    );
    
    alter table Reply 
       add constraint FKayalcledc3l0g5lt1balg0jwf 
       foreign key (boardId) 
       references Board;

    alter table Reply 
       add constraint FK6kfhyt67t1dcd8gl4u2y3urei 
       foreign key (memberId)
       references Member;