본문 바로가기
Spring

Spring Join

by code2772 2022. 12. 13.

[ 목차 ]

    728x90
    반응형

    ✔  Category Join

    @Entity // JPA를 사용해서 DB 테이블과 메핑할 클래스를 연결
    @NoArgsConstructor // 파라미터가 없는 기본 생성자를 생성
    @AllArgsConstructor //모든 필드 값을 파라미터로 받는 생성자를 만들어줌
    @Data
    @Builder // 연속적으로 실행하게 해주는 기능 ex) method.method ......
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    @EntityListeners(AuditingEntityListener.class)
    public class Category extends BaseEntity implements Auditable { // ctrl + shift + t
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String type;
        private String title;
        private String updateBy;
    // Category : partner (1:N)
    
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "category")
        // lazy가 대부분에서 사용된다. 쓸데없는 다른 모든 객체를 가저올 필요가 없다
        // Eager 아무것도 사용하지 않으면 기본으로 사용되고 모든 데이터를 가저오는 것이다.
    
        private List<Partner> partners;
        // category 파일에 선언하였다 partner을 @OneToMany 형으로.

     

    Category : Partner 는 (1 : N) 관계 -> 하나의 카테고리(전자)에 여러 파트너(삼성전자, apple전자)

    그렇기 때문에 Category 부분에서 @OneToMany 사용

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "category")를 사용

    FetchyType을 선언하지 않으면 Eager로 자동으로 들어간다. Eager는 모든 데이터를 가저오기 때문에 복잡한 내용을 쓸 경우 오래 걸리거나 문제 발생율이 올라가기 때문에 자주 사용은 하지 않는다.

    여기에서는 Lazy를 선언하였다. Lazy는 대부분의 프로그램 사용간 많이 사용한다.

    Eager의 문제 발생을 막기 위해 사용하며 쓸데없는 다른 모든 객체를 가저올 필요 없이 해당 원하는 부분만 가저올 수 있어 문제 발생율이 줄어든다.

     

    ✔ Partner Join

    @Entity
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    @EntityListeners(AuditingEntityListener.class)
    public class Partner extends BaseEntity implements Auditable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        @Enumerated(EnumType.STRING)
        private UserStatus status;
        private String address;
        private String callCenter;
        private String businessNumber;
        private String ceoName;
    //    private LocalDateTime regDate;
    //    private LocalDateTime updateDate;
    //    private Long categoryId;
    
        @ManyToOne
        private Category category;
    
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "partner")
        private List<Item> items;
    
    }

     

    Partner : Category 는 (N : 1) 관계 -> @ManyToOne 의 관계이다.
    여기에서 Private Category category;를 사용 하는 이유는 테이블 관계가 여끼는 Category를 Partner 부분에서 선언하여 서로 연관을 가지기 위해 선언한다.

    마지막으로 private Long CategoryId  외래키는 연관 관계 메핑을 이용하여 관계를 맺었기 때문에 지워준다. 지우지 안을 경우 중복이 발생하여 오류가 발생한다.

     

    ✔ Join Test

     

    @Transactional : 오류 메시지(no session)인 경우 @Transactional을 선언하여 session을 확인한다.

    Stream() : 다른 클래스의 메소드를 가져온다 (getter/setter) 와 유사하다...

     

    users.ifPresent( ...

    .......

    selectUsers.getOrderGroups().stream().forEach : Users 테이블에서 -> get(OrderGroup을 가저오고) -> Stream 다른 세션을 가저오고 -> forEach 반복한다.

     

    ......

    orderGroup.getOrderDeatail.stram().forEach // 위와 동일한 방식을 사용하여 Join

     

    다른 테이블에 있는 내용을 출력하고 싶은 경우

    예 ) Sout("판매쳐 : " + orderDetail.getItem().getPartner.getName())

    orderDetail()에서 먼저 시작한다(해당 orderDetail에서 ) -> getItem()에서 Item 테이블로 이동

    -> getPartnerr() 아이템의 참조는 Partner이기 때문에 get을 사용하여 Partner테이블로 이동

    -> .getName() Partner 테이블의 이름을 출력한다. 

     

    해당 테이블에서 없는 내용을 출력하고 싶은 경우에는 위와 같은 방식을 사용한다.

    반응형