일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Git
- fixedDelay
- @Entity
- 네이버 연결된 서비스
- SpringBoot
- gitreset
- initialDelay
- DB방언
- @Table
- RFC723x
- anyMatch
- KAKAOLOGINAPI
- 무상태프로토콜
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- Transaction not successfully started
- hibernate.dialect
- 매핑정보가없는필드
- 데이터베이스 방언
- 김영한JPA
- org.apache.ibatis.binding.BindingException
- 멱등활용
- 캐쉬가능
- HTTPMESSAGE
- gitrevert
- JPA
- 네이버로그인API
- HTTP3
- 자바ORM표준프로그래밍
- Invalid bound statement (not found)
- http
Archives
- Today
- Total
twocowsong
다대다 : 새로운 기본 키 사용 본문
추천하는 기본 키 생성 전략은 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이 예약어라서 엔티티 생성이 안되는 이슈가 있었습니다.
'IT > JPA' 카테고리의 다른 글
상속 관계 매핑 (0) | 2022.06.30 |
---|---|
다대다 연관관계 정리 (0) | 2022.06.28 |
다 대 다 : 매핑의 한계와 극복, 연결 엔티티 사용 (0) | 2022.06.26 |
다 대 다 : 양방향 (0) | 2022.06.26 |
다 대 다 : 단방향 (0) | 2022.06.21 |