Christmas Pikachu JPA - 테이블 생성하기
카테고리 없음

JPA - 테이블 생성하기

ZI_CO 2022. 12. 8.

ORM 기술을 사용해서 테이블을 생성해 보자.

 

 

User 모델링 후 테이블 생성 및 컬럼 제약 추가

package com.tencoding.blog.dto;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;

import com.tencoding.blog.model.RoleType;

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

// 1. mysql server 실행
// 2. 테이블 생성
// 3. 제약 추가
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
// @DynamicInsert //null 필드가 들어 올때 무시하라 --> 디폴트값 선언하면 적용됨
public class User {
	@Id // Primary key PK로 지정한다.
	@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에서 연결된 DB 넘버링 전략을 따라간다.(오토인크리먼트 적용)
	private int id;
	
	@Column(nullable = false, length = 30)
	private String username;
	
	@Column(nullable = false, length = 100)
	private String password;
	
	@Column(nullable = false, length = 50)
	private String email;
	
	//@ColumnDefault("'user'")// 문자라는 것을 알려주어야 한다. --> ('')
	@Enumerated(EnumType.STRING) // DB에게 String타입이라고 알려 줘야 한다.
	private RoleType role; // Enum 변경
	
	@CreationTimestamp // 시간이 자동으로 입력된다.
	private Timestamp createDate;
	
}

 

 

 

 

Board 테이블 생성 및 제약 및 연관 관계 추가 하기

package com.tencoding.blog.dto;

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
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Board {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	
	@Column(nullable = false, length = 150)
	private String title;
	
	@Lob // 대용량 데이터 선언
	private String content;
	
	@ColumnDefault("0")
	private int count;
	
	// 연관 관계 설정
	@ManyToOne (fetch = FetchType.EAGER)
	@JoinColumn(name = "userId") // 컬럼명을 직접 지정
	private User userId;
	
	// 오브젝트를 다룰 때 가지고 와 달라고 요청해야 함(mappedBy)
	// Board <---> Reply 관계
	// 연관 관계에 주인이 아니다 (select 할 때 가지고 와야하는 데이터이다.)
	@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
	private List<Reply> reply;
	// reply - FK board table 생성이 된다 1.정규화 위반!!!
	
	@CreationTimestamp
	private Timestamp createDate;
}

 

 

 

Reply테이블 생성 생성 및 제약 및 연관 관계 추가 하기

package com.tencoding.blog.dto;

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 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;
	
	// board 연관 관계 처리
	@ManyToOne
	@JoinColumn(name = "boardId")
	private Board board;
	
	// user 연관 관계 처리
	@ManyToOne 
	@JoinColumn(name = "userId")
	private User user;
	
	@CreationTimestamp
	private Timestamp createDate;
	
}

 

 

테이블 설계가 다됬을경우!!!

ddl-auto: update 로 수정

server:
  port: 9090
  servlet:
    context-path: /blog


spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul
    username: ****
    password: ******
  
  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: false
    show-sql: true
    properties:
      hibernate.format_sql: true
      
  jackson:
    serialization:
      fail-on-empty-beans: false

댓글