[SpringBoot] Entity

2023. 10. 14. 10:01·Web & Android/SpringBoot

클래스에 **@Getter, @Entity, @Builder, @DynamicUpdate, @AllArgsConstructor, @NoArgsConstructor(access=AccessLevel.PROTECTED)**를 추가

  • 복합키

    • @IdClass 이용

      • 식별자 클래스의 변수명과 엔티티에서 사용되는 변수명이 동일
      • 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)
      • 식별자 클래스의 접근 지정자는 public
      • Serializable을 상속
      • equals, hashCode 구현 (위의 코드는 Lombok의 @Data어노테이션 추가로 자동 생성)
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      public class StudentID implements Serializable {
          private String studentId;
          private String name;
      }
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      @Entity
      @Table(name = "student")
      @IdClass(StudentID.class)
      public class Student implements Serializable {
          @Id
          @Column(name = "student_id")
          private String studentId;
      
          @Id
          private String name;
      
          @Column(name = "school_id")
          private int schoolId;
          private int score;
      }
    • @Embeddable 이용

      • 식별자 클래스에 @Embeddable어노테이션 추가

      • 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)

      • 식별자 클래스의 접근 지정자는 public

      • Serializable을 상속

      • equals, hashCode 구현 (위의 코드는 Lombok의 @Data어노테이션 추가로 자동 생성)

      • 컬럼명과 변수명이 다를 경우 @Column어노테이션 사용

        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        @Embeddable
        public class Student implements Serializable {
        @Column(name = "studend_id")
        private String studentId;
        
        private String name;
        }
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        @Entity
        @Table(name = "student")
        public class Student implements Serializable {
        @EmbeddedId
        private StudentID stduentID;
        
        @Column(name = "school_id")
        private int schoolId;
        private int score;
        }
    • IdClass vs EmbeddableId

      • 차이점은 엔티티 클래스를 작성할 때 귀찮기 vs 변수를 사용할 때 귀찮기의 차이
        • IdClass 경우 식별자 클래스에 있는 모든 변수들을 그대로 엔티이 클래스에 작성해야 하므로 다소 시간이 소모됨
        • 하지만 생성된 클래스들을 사용할 때는
          • IdClass는 student.getName()
          • EmbeddedId는 student.getStudentID().getName()⇒ 취향대로 사용
  • 외래키이면서 기본키인 경우 코드를 중복해서 작성해야 함

    • 그렇지 않으면 IdClass가 없다는 오류가 발생하게 됨

    • 해결 전 코드

      • 오류 발생
        • Error creating bean with name 'runRecordRepository' defined in com.example.walkingmate_back.history.repository.RunRecordRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: This class [class com.example.walkingmate_back.history.entity.RunRecord] does not define an IdClass
      @Entity
      @Getter
      @Setter
      @ToString
      @NoArgsConstructor
      @AllArgsConstructor
      @EqualsAndHashCode
      @Table(name = "teamBank")
      public class TeamBank {
      
              // 외래키이면서 기본키
          @Id
          @OneToOne(fetch = FetchType.LAZY)
          @JoinColumn(name = "teamId") // 외래키 설정
          private Team team;  // 팀 id
      
          @Column
          private String tear;  // 팀 티어
      
          @Column
          private int coin;  // 팀 코인
      }
    • 해결 후 코드

      @Entity
      @Getter
      @Setter
      @ToString
      @NoArgsConstructor
      @AllArgsConstructor
      @EqualsAndHashCode
      @Table(name = "teamBank")
      public class TeamBank {
      
              // 외래키이면서 기본키
          @Id
          @Column(name = "teamId")
          private Long id; // 팀 id
      
              // 위와 같은 컬럼(외래키 설정)
          @OneToOne(fetch = FetchType.LAZY)
          @JoinColumn(name = "teamId") // 외래키 설정
          private Team team;  // 팀 id
      
          @Column
          private String tear;  // 팀 티어
      
          @Column
          private int coin;  // 팀 코인
      }

생성할 컬럼 생성

// 기본키 설정
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "board_id", nullable = false)
    private Long id;

// columnDefinition : 컬럼 타입
@Column(name = "board_content", columnDefinition = "TEXT", nullable = false)
    private String content;

@Enumerated(EnumType.STRING) // String으로 저장
@ManyToOne(fetch = FetchType.LAZY)  //  다대일 관계
@JoinColumn(name = "member_id", nullable = false) // 외래키 설정
    private Member member;

Member

package com.study.crudtest.domain;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.DynamicUpdate;

@Getter
@Entity
@Builder
@DynamicUpdate
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

    @Id
    @Column(name = "member_id", length = 20, nullable = false)
    private String id;

    @Column(name = "member_password", nullable = false)
    private String password;

    @Column(name = "member_name", nullable = false)
    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name = "member_role", nullable = false)
    private MemberRole role;
}

Board

package com.study.crudtest.domain;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.DynamicUpdate;

import java.time.LocalDateTime;

@Getter
@Entity
@Builder
@DynamicUpdate
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "board_id", nullable = false)
    private Long id;

    @Column(name = "board_title", nullable = false)
    private String title;

    @Column(name = "board_content", columnDefinition = "TEXT", nullable = false)
    private String content;

    @Column(name = "board_created_at", nullable = false)
    private LocalDateTime createdAt;

    @Column(name = "board_updated_at", nullable = false)
    private LocalDateTime updatedAt;

    @Column(name = "board_admin_views", nullable = false)
    private int adminViews;

    @Column(name = "board_user_views", nullable = false)
    private int userViews;

    @Column(name = "board_likes", nullable = false)
    private int likes;

    @Enumerated(EnumType.STRING)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id", nullable = false)
    private Member member;

}

Item

package kr.spring.item.entity;
// 아이템 엔티티 생성
import jakarta.persistence.*;
import kr.spring.item.constant.ItemSellStatus;
import lombok.*;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "my_item") // 테이블 명칭 지정
@Getter
@Setter // 필수 아님
@ToString // 문자열 자동 생성
@NoArgsConstructor // 빈생성자 생성
@AllArgsConstructor // 모든 필드
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id")
    private Long id;                     // 상품 코드

    @Column(nullable = false, length = 50)
    private String itemNm;               // 상품 이름

    @Column(nullable = false)
    private int price;                   // 상품 가격

    @Column(nullable = false, name="number")
    private int stockNumber;             // 재고 수량

    @Enumerated(EnumType.STRING)
    private ItemSellStatus itemSellStatus;

    @Lob // 큰 데이터를 저장하는데 사용하는 데이터형(동영상, 이미지 등)
    @Column(nullable = false)
    private String itemDetail;           // 상품 상세 설명

    private LocalDateTime regTime;       // 등록 시간

    private LocalDateTime updateTime;    // 수정 시간


}

저작자표시 비영리 변경금지 (새창열림)

'Web & Android > SpringBoot' 카테고리의 다른 글

[SpringBoot] 페이징 처리  (0) 2023.10.14
[SpringBoot] ResponseEntity  (0) 2023.10.14
[SpringBoot] enum Class (열거형)  (0) 2023.10.14
[SpringBoot] Bootstrap  (0) 2023.10.14
[SpringBoot] Spring Boot Devtools  (0) 2023.10.14
'Web & Android/SpringBoot' 카테고리의 다른 글
  • [SpringBoot] 페이징 처리
  • [SpringBoot] ResponseEntity
  • [SpringBoot] enum Class (열거형)
  • [SpringBoot] Bootstrap
woojin._.
woojin._.
여러가지 개발을 해보며 발생하는 이야기들에 대한 블로그입니다:)
  • woojin._.
    Jin's Dev Story
    woojin._.
  • 전체
    오늘
    어제
    • 분류 전체보기 (829)
      • Tools (25)
        • eGovFrame (3)
        • GeoServer (3)
        • QGIS (2)
        • LabelImg (2)
        • Git (6)
        • GitHub (1)
        • Eclipse (7)
        • Visual Studio (1)
      • Web & Android (121)
        • SpringBoot (37)
        • Three.js (2)
        • Spring Data JPA (9)
        • 스프링 부트 쇼핑몰 프로젝트 with JPA (25)
        • Thymeleaf (4)
        • Spring Security (15)
        • Flutter (29)
      • Programming Language (61)
        • JAVA (27)
        • JavaScript (14)
        • Dart (2)
        • Python (15)
        • PHP (3)
      • Database (43)
        • PostgreSQL (32)
        • MYSQL (7)
        • Oracle (3)
        • MSSQL (1)
      • SERVER (17)
        • TCP_IP (3)
        • 리눅스 (7)
        • AWS (7)
      • Coding Test (445)
        • 백준[JAVA] (108)
        • 프로그래머스[JAVA] (260)
        • 알고리즘 고득점 Kit[JAVA] (3)
        • SQL 고득점 Kit[ORACLE] (74)
      • CS 지식 (49)
        • [자료구조] (14)
        • [네트워크] (12)
        • [데이터베이스] (10)
        • [알고리즘] (9)
        • [운영체제] (4)
      • 기타 (6)
      • 자격증 & 공부 (62)
        • 정보처리기사 (2)
        • SQLD (6)
        • 네트워크관리사 2급 (5)
        • 리눅스마스터 1급 (44)
        • 리눅스마스터 2급 (1)
        • ISTQB (3)
        • 시스템보안 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 태그

    backjoon
    postgresql
    스프링
    Java
    spring
    programmers
    자바
    CS지식
    Linux
    Spring Security
    리눅스마스터 1급
    CS
    DB
    백준
    Oracle
    데이터베이스
    pcce 기출문제
    springboot
    리눅스마스터
    python
    리눅스
    Flutter
    데이터
    baekjoon
    스프링 부트 쇼핑몰 프로젝트 with JPA
    플러터
    프로그래머스
    스프링부트
    JPA
    시큐리티
  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
woojin._.
[SpringBoot] Entity
상단으로

티스토리툴바