JPA 연관 관계 매핑2_다대일 단방향 매핑하기

개발자·2022년 4월 19일
0
post-thumbnail
post-custom-banner

이전 포스팅에서는 @OneToOne. JPA에서 일대일 단방향 매핑하는 방법에 대해서 알아보았었다.

이번 포스팅에서는 @ManyToOne 어노테이션을 이용해 다대일 단방향 매핑을 하는 방법에 대해 알아보고자 한다.

이전 포스팅에서 장바구니와 회원 엔티티를 예로 들어 설명했기 때문에 이번에도 비슷한 예를 들고자 한다.


장바구니에는 각 회원이 관심있어 하거나 나중에 살 수도 있는 상품들을 담아둘 것이다.

하나의 장바구니에는 하나부터 수십 개까지, 여러개의 상품들이 담길 수 있다.

또한 하나의 상품을 하나부터 수십 개까지, 여러번 주문할 수도 있기 때문에 몇 개의 상품을 담을 것인지 설정도 해줘야 한다.


장바구니는 Cart, 상품은 Item, 장바구니 속 상품은 CartItem으로 부를 것이다.

아래 각각의 Entity가 있다.

@Entity
@Table(name = "cart")
@Getter @Setter
@ToString
public class Cart {

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

    @OneToOne
    @JoinColumn(name = "member_id")
    private Member member;
}
@Entity
@Table(name = "member")
@Getter @Setter
@ToString
public class Member {

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

    private String name;

    @Column(unique = true)
    private String email;

    private String password;

    private String address;

    @Enumerated(EnumType.STRING)
    private Role role;

    public static Member createMember(MemberFormDto memberFormDto, PasswordEncoder passwordEncoder) {
        Member member = new Member();
        member.setName(memberFormDto.getName());
        member.setEmail(memberFormDto.getEmail());
        member.setAddress(memberFormDto.getAddress());
        member.setRole(Role.USER);
        String password = passwordEncoder.encode(memberFormDto.getPassword());
        member.setPassword(password);
        return member;
    }
}
@Entity
@Table(name = "item")
@Getter
@Setter
@ToString
public class Item {

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

    @Column(nullable = false, length = 50)
    private String itemNm; 

    @Column(name = "price", nullable = false)
    private int price; 

    @Column(nullable = false)
    private int stockNumber; 

    @Lob
    @Column(nullable = false)
    private String itemDetail; 

    @Enumerated(EnumType.STRING)
    private ItemSellStatus itemSellStatus; 

    private LocalDateTime regTime; 

    private LocalDateTime updateTime; 
}

CartItem Entity를 보면 하나의 장바구니에는 여러 개의 상품을 담을 수 있기 때문에 @ManyToOne 어노테이션을 사용해 다대일 관계로 매핑하고 있다.

장바구니에 담을 상품의 정보도 알아야 하기 때문에 Item Entity도 매핑을 해주었다.

하나의 상품은 여러 장바구니 속의 장바구니 상품으로 담길 수 있기 때문에 마찬가지로 @ManyToOne 어노테이션으로 다대일 매핑을 해주었다.


Entity를 모두 작성해주고 애플리케이션을 실행해 콘솔창을 확인해 보면 다음과 같은 쿼리문이 출력되는 것을 볼 수 있다.

Hibernate:
create table cart_item (
   cart_item_id bigint not null,
    count integer not null,
    cart_id bigint,
    item_id bigint,
    primary key (cart_item_id)
) engine=InnoDB

cart_item이라는 테이블에 앞서 Entity에서 @JoinCoulmn 어노테이션을 이용해 name으로 설정한 값이 컬럼의 id인 cart_id와 item_id라고 추가된다.


Hibernate:
alter table cart_item
   add constraint FK1uobyhgl1wvgt1jpccia8xxs3
   foreign key (cart_id)
   references cart (cart_id)
Hibernate:
alter table cart_item
   add constraint FKdljf497fwm1f8eb1h8t6n50u9
   foreign key (item_id)
   references item (item_id)

또한 엔티티와 매핑되는 테이블에 @JoinColumn 어노테이션의 name으로 설정한 값이 외래키(foreign key)로 추가되어 해당 테이블을 참조하고 있음을 확인할 수 있다.

profile
I DEVELOP THEREFORE, I AM 😄
post-custom-banner

0개의 댓글