클래스에 **@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()⇒ 취향대로 사용
- 차이점은 엔티티 클래스를 작성할 때 귀찮기 vs 변수를 사용할 때 귀찮기의 차이
외래키이면서 기본키인 경우 코드를 중복해서 작성해야 함
그렇지 않으면 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 |