twocowsong

다대다 : 새로운 기본 키 사용 본문

IT/JPA

다대다 : 새로운 기본 키 사용

WsCode 2022. 6. 27. 22:07

추천하는 기본 키 생성 전략은 DB에서 자동으로 생성해주는 대리키 Long값으로 사용하는것입니다.

이것의 장점은 간편하고 거의 영구히 쓸 수 있으며 비즈니스에 의존하지 않습니다.

그리고 ORM매핑 시에 복합 키를 만들지 않아도 되므로 간단히 매핑을 완성할수 있습니다.

 

이번에는 연결 테이블에 새로운 기본 키를 사용해볼것입니다.

이 정도 되면 회원상품 보다는 주문이라는 이름이 더 어울릴것같습니다.

@Entity
@Table(name = "MEMBER_ORDER")
public class MemberOrder {

   @Id
   @GeneratedValue
   @Column(name = "ORDER_ID")
   private Long id;

   @ManyToOne
   @JoinColumn(name = "MEMBER_ID")
   private Member member;

   @ManyToOne
   @JoinColumn(name = "PRODUCT_ID")
   private Product product;

   @Column(name = "ORDER_AMOUNT")
   private int orderAmount;

}

ORDER_ID를 Long 타입으로 추가하였습니다.

대리 키(ORDER_ID)를 사용함으로써 이전에 보았던 식별 관계에 복합 키를 사용하는 것보다 매핑이 단순하고 이해하기 쉽습니다.

@Entity
@Table(name = "MEMBER")
public class Member {

   @Id
   @Column(name="MEMBER_ID")
   private String id;

   private String username;

   @OneToMany(mappedBy = "member")
   private List<MemberOrder> memberOrders = new ArrayList<>();

   // Getter, Setter...
}
@Entity
@Table(name = "PRODUCT")
public class Product {
   @Id
   @Column(name = "PRODUCT_ID")
   private String id;

   private String name;
}

 

public static void save(EntityManager em) {
   // 회원 저장
   Member member = new Member();
   member.setId("member1");
   member.setUsername("회원1");
   em.persist(member);

   // 상품 저장
   Product product = new Product();
   product.setId("productA");
   product.setName("상품A");
   em.persist(product);

   // 주문 저장
   MemberOrder memberOrder = new MemberOrder();
   memberOrder.setMember(member);
   memberOrder.setProduct(product);
   memberOrder.setOrderAmount(2);
   em.persist(memberOrder);
}
public static void find(EntityManager em) {
   Long orderId = 1L;
   MemberOrder memberOrder = em.find(MemberOrder.class, orderId);
   Member member = memberOrder.getMember();
   Product product = memberOrder.getProduct();

   System.out.println("member ID : " + member.getId());
   System.out.println("product : " + product.getId());
   System.out.println("orderAmount : " + memberOrder.getOrderAmount());
}
member ID : member1
product : productA
orderAmount : 2

서적에서는 MemberOrder 테이블이아니라 Order엔티티로 적혀있었는데.. MySql에서는 Order이 예약어라서 엔티티 생성이 안되는 이슈가 있었습니다.

https://dev-nomad.com/82

'IT > JPA' 카테고리의 다른 글

상속 관계 매핑  (0) 2022.06.30
다대다 연관관계 정리  (0) 2022.06.28
다 대 다 : 매핑의 한계와 극복, 연결 엔티티 사용  (0) 2022.06.26
다 대 다 : 양방향  (0) 2022.06.26
다 대 다 : 단방향  (0) 2022.06.21