
예시
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long orderId;
   @Enumerated(EnumType.STRING)
   private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;
   @Column(nullable = false)
   private LocalDateTime createdAt = LocalDateTime.now();
   @Column(nullable = false, name = "LAST_MODIFIED_AT")
   private LocalDateTime modifiedAt = LocalDateTime.now();
   public enum OrderStatus {
      ORDER_REQUEST(1, "주문 요청"),
      ORDER_CONFIRM(2, "주문 확정"),
      ORDER_COMPLETE(3, "주문 완료"),
      ORDER_CANCEL(4, "주문 취소");
      @Getter
      private int stepNumber;
      @Getter
      private String stepDescription;
      OrderStatus(int stepNumber, String stepDescription) {
          this.stepNumber = stepNumber;
          this.stepDescription = stepDescription;
      }
   }  
}
엔티티 매핑 관련 애너테이션
| Annotation | Attribute | 설명 | 
|---|---|---|
| @NoArgsConstructor(필수) | - | 매개변수가 없는 생성자 자동 생성 | 
| @AllArgsConstructor | - | 매개변수가 있는 생성자 자동 생성 | 
| @Getter | - | getter 자동 생성 | 
| @Setter | - | setter 자동 생성 | 
| @Entity (필수) | name : Entity 이름 설정(default: 클래스명) | JPA 관리 대상 Entity 지정(DB Table과 매핑) | 
| @Table (선택) | name : DB Table 이름 설정(default: 클래스명) | DB Table 이름 설정 | 
| @Id (필수) | - | 해당 field를 DB의 기본키(Primary Key, PK) 지정 | 
| @GeneratedValue | strategy : 기본키 생성 전략 | 기본키 자동 생성 지원(없을 시 수동 지정) | 
| ∥ | strategy = GenerationType.IDENTITY | 기본키 생성을 DB가 대신 해줌(commit 여부 상관 X. persist 실행 시 INSERT 실행 후 PK 가져옴) | 
| ∥ | strategy = GenerationType.SEQUENCE | DB 제공 시퀀스 사용하여 기본키 생성 | 
| ∥ | strategy = GenerationType.AUTO | JPA가 DB의 Dialect에 따라 적절한 전략을 자동 선택 | 
| @Column (선택) | 지정하지 않을 시 default값으로 매핑 | 필드와 컬럼 매핑 | 
| ∥ | name | Table 컬럼 이름 지정하여 컬럼 생성 | 
| ∥ | nullable | null 허용 여부 (default : true). 원시타입 적용 시 false 지정해야 에러 방지 | 
| ∥ | updatable | 컬럼 데이터 수정 가능 여부 (default : false) | 
| ∥ | unique | 중복 제한 조건 (default : false) | 
| ∥ | length | 문자열 길이 제한 (default : 255) | 
| @Transient | - | Table Column 매핑 X(임시 데이터 용도) | 
| @Enumerated | EnumType.___ | enum 타입과 매핑 시 사용 | 
| ∥ | EnumType.STRING | enum 이름을 DB 저장 | 
| ∥ | EnumType.ORDINAL | enum 순서를 테이블에 저장(순서가 뒤바뀔 가능성 있으므로 사용 자제) | 
연관관계매핑 : 엔티티 클래스 간의 관계를 만들어주는 것
JPA에서의 연관관계 매핑 : Entity가 Entity를 참조하는 것
연관 관계 종류
1:N (1<N)
// 다대일 단방향 연관관계 예시
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
  ...
  @ManyToOne // 다대일 관계 명시
  @JoinColumn(name = "MEMBER_ID")
  private Member member;
  public void addMember(Member member) {
      this.member = member;
  }
  
  ...
  
}
다대일 단방향 연관관계 매핑
// 일대다 매핑을 추가하여 다대일 양방향 매핑 구현
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {
  
  ...
  @OneToMany(mappedBy = "member")
  private List<Order> orders = new ArrayList<>();
  
  ...
}
다대일 매핑에 일대다 매핑을 추가하여 양방향 관계 생성
The field that owns the relationship. 
Required unless the relationship is unidirectional.
N:N (N<>N)
// 다대다 연관관계
// N : 1 : N
public class Order { // N
  ...
  
  @OneToMany(mappedBy = "order")
  private List<OrderCoffee> orderCoffees = new ArrayList<>();
  
  ...
}
public class OrderCoffee { // 1
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long orderCoffeeId;
  
  @ManyToOne
  @JoinColumn(name = "ORDER_ID")
  private Order order;
  
  @ManyToOne
  @JoinColumn(name = "COFFEE_ID")
  private Coffee coffee;
  
  @Column(nullable = false)
  private Integer quantity;
}
public class Coffee { // N
  ...
  
  @OneToMany(mappedBy = "coffee")
  private List<OrderCoffee> orderCoffees = new ArrayList<>();
  
  ...
}
1:1 (1-1)
public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.TDENTITY)
  private long memberId;
  ...
  
  @OneToOne(mappedBy = "member", cascade = CascadeType.ALL)
  private Stamp stamp;
}
public class Stamp {
  ...
  
  @OneToOne
  @JoinColumn(name = "MEMBER_ID")
  private Member member;
}