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이 예약어라서 엔티티 생성이 안되는 이슈가 있었습니다.