이전 포스팅에서는 @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)로 추가되어 해당 테이블을 참조하고 있음을 확인할 수 있다.