BackEnd/Spring Boot

JPA Entity여러 경우 적용_1

Raconer 2023. 6. 11. 15:56
728x90

소개

JPA-적응기1에 작성된 내용을 기반으로 작성하였으며
이후 총 정리 및 사용 후기 등을 JPA-적응기2에 올릴 생각입니다.
또한 추후에 어떤 기술을 추가로 사용 해볼것인지도 같이 작성하겠습니다.

개발 환경

DDL과 Entity 비교

예시들은 기본 Entity, 공통 Entity, 멀티키 Entity 만 작성 되어 있고 그외에는 Github 로 들어가서 확인해 주시면 감사하겠습니다.

  1. common

공통으로 들어가는 Column은 상속 받아 사용한다.
다른 방법으로 @Embeddable 을 사용하여 변수 처럼 사용 할수있다.

  • Entity
// 다른 Entity에서 사용시 "extends CommonEntity" 하여 사용하면된다. 
@Data
@MappedSuperclass
public class CommonEntity {

    @Column(updatable = false, nullable = false)
    protected Date regDate;

    @Column(nullable = true, insertable = true)
    protected Date modDate;
}

또는

/*
     다른 Entity에서 사용시 

    @Embedded
    private CommonEntity commonEntity;
*/
@Embeddable
public class CommonEntity {

    @Column(updatable = false, nullable = false)
    protected Date regDate;

    @Column(nullable = true, insertable = true)
    protected Date modDate;

    // Getter, Setter, 등 필요한 메서드들
}
  1. product
  • DDL
    CREATE TABLE `products` (
      `Key`    INT    NOT NULL,
      `name`    VARCHAR(50)    NOT NULL,
      `price`    DECIMAL(10,2)    NOT NULL,
      `reg_date`    DATE    NOT NULL,
      `mod_date`    DATE    NULL
    );
  • Entity
    @Data
    @Entity
    @Table(name = "Products")
    @EqualsAndHashCode(callSuper=false)
    public class ProductsEntity extends CommonEntity {

      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "id")
      private Long id;

      @Column(nullable = false, length = 100)
      private String name;

      @ColumnDefault("0")
      private Double price;
    }
  1. product_categories

멀티 키 사용
RDS를 사용하다 보면 동적으로 Type을 관리 할때가 있다.
ManyToMaNy 이며
하단의 예로 하나의 product에도 여러개의 카테고리가 입력 될수 도 있기 때문에 아래와 같은 경우도 사용한다.

  • DDL
CREATE TABLE `product_categories` (
    `category_id`    INT    NOT NULL,
    `product_id`    INT    NOT NULL,
    `reg_date`    DATE    NOT NULL,
    `mod_date`    DATE    NULL
);
  • Entity
@Data
@Entity
@Table(name = "ProductCategories")
@IdClass(ProductCategoryEntity.ProductCategoryId.class)
@EqualsAndHashCode(callSuper=false)
public class ProductCategoryEntity extends CommonEntity {

    @Id
    @ManyToOne
    @JoinColumn(name = "category_id")
    private CategoryEntity categories;

    @Id
    @ManyToOne
    @JoinColumn(name = "product_id")
    private ProductsEntity products;

    public static class ProductCategoryId implements Serializable {
        private CategoryEntity categories;
        private ProductsEntity products;
    }
}
728x90

'BackEnd > Spring Boot' 카테고리의 다른 글

JPA 적응기_2(Basic편)  (0) 2023.06.11
JPA 기본 log사용하기  (0) 2023.06.11
JPA @Column 옵션  (0) 2023.06.10
JPA 테스트 환경 구축  (0) 2023.06.10
JPA GenerationType 속성  (0) 2023.06.09