Jin's Dev Story

[SpringBoot] Entity 본문

Web & Android/SpringBoot

[SpringBoot] Entity

woojin._. 2023. 10. 14. 10:01

클래스에 **@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