일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 멱등활용
- HTTPMESSAGE
- gitrevert
- http
- JPA
- anyMatch
- @Entity
- Git
- @Table
- Invalid bound statement (not found)
- initialDelay
- 데이터베이스 방언
- RFC723x
- 네이버 연결된 서비스
- 자바ORM표준프로그래밍
- org.apache.ibatis.binding.BindingException
- gitreset
- 캐쉬가능
- SpringBoot
- KAKAOLOGINAPI
- DB방언
- HTTP3
- Transaction not successfully started
- 네이버로그인API
- fixedDelay
- hibernate.dialect
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- 무상태프로토콜
- 김영한JPA
- 매핑정보가없는필드
- Today
- Total
목록IT/JPA (77)
twocowsong
객체의 상속 관계를 DB에 어떻게 매핑할지를 다루는 매핑입니다. 관계형 DB에는 객체지향 언어에서 다루는 상속이라는 개념이 없습니다. 대신에 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 비슷합니다. ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는것입니다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있습니다.
다대다 관계를 일대다 다대일 관계로 풀어내기 위해 연결 테이블을 만들 때 식별자를 어떻게 구성할지 선택해야 합니다. - 식별 관계 : 받아온 식별자를 기본 키 + 외래키 로 사용 - 비식별 관계 : 받아온 식별자는 외래 키로만 사용하고 새로운 식별자를 추가 DB 설계에서는 1번 처럼 부모 테이블의 기본 키를 받아서 자식 테이블의 기본 키 + 외래 키로 사용하는것을 식별 관계라고 합니다. 2번처럼 단순히 외래 키로만 사용하는것을 비식별 관계 라고합니다. 객체 입장에서 보면 2번처럼 비식별 관계를 사용하는것이 복합 키를 위한 식별자 클래스를 만들지 않아도 되므로 단순하고 편리하게 ORM매핑을 할 수 있습니다.
추천하는 기본 키 생성 전략은 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") priv..
@ManyToMany를 사용하면 연결 테이블을 자동으로 처리해주므로 도메인 모델이 단순해지고 편리해집니다. 하지만 이 매핑에는 한계가 있습니다. 예를들어 회원이 상품을 주문하면 연결 테이블에 단순히 주문한 회원 아이디와 상품 아이디만 담고 끝나지 않습니다. 예를들어 회원이 상품을 주문하면 연결 테이블에 단순히 주문한 회원아이디와 상품 아이디만 담고 끝나지 않습니다. 보통은 연결 테이블에 주문 수량 컬럼이나 주문한 날짜 같은 컬럼이 더 필요합니다. 연결 테이블에 주문 수량(ORDERAMOUNT)과 주문 날짜(ORDERDATE)컬럼을 추가했습니다. 이렇게 컬럼을 추가하면 더는 @ManyToMany를 사용 할 수 없습니다. 왜냐하면 주문 엔티티나 상품엔티티에는 추가한 컬럼들이 매핑이 될수 없기 때문입니다. 결..
다대다 매핑이므로 역방향도 @ManyToMany를 사용합니다. 그리고 양쪽 중 원하는곳에 mappedBy로 연관관계의 주인을 지정합니다. (mappedBy가 없는곳이 연관관계의 주인이 됩니다.) @Entity public class Product { @Id private String id; private String name; @ManyToMany(mappedBy = "products") private List members; } 다대다의 양방향 연관관계는 다음처럼 설정하면 됩니다. member.getProducts().add(product); product.getMembers().add(member); 위같은 상황에는 양방향 연관관계는 연관관계 편의 메소드를 추가해서 관리하는것이 편리합니다. (그렇지 ..
다 대 다 단방향 관계인 회원 엔티티를 보겠습니다. @Entity public class Product { @Id @Column(name = "PRODUCT_ID") private String id; private String name; } @Entity public class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "MEMBER_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_I..
관계형 DB는 정규화된 테이블 2개로 N : N 관계를 표현할 수 없습니다. 그래서 보통은 N : N 관계를 1 : N, N : 1 관계로 풀어내는 연결 테이블을 사용합니다. 예를 들어 회원들은 상품을 주문합니다. 반대로 상품들은 회원들에 의해 주문됩니다. 한 상품은 여러회원들에게 주문되고, 한 회원은 여러개의 상품을 주문함으로 둘은 N : N 관계를 가집니다. 따라서 회원 테이블과 상품 테이블만으로는 이 관계를 표현 할 수 없습니다. 중간에 연결 테이블을 추가해서 사용해야 합니다. 아래의 그림처럼 MEMBER_PRODUCT 연결 테이블을 추가했습니다. 테이블을 사용해서 N : N 관계를 1 : N, N : 1 관계로 풀어 낼 수 있습니다. 이 연결 테이블은 회원이 주문한 상품을 나타냅니다. 그런데 객체..
이번에는 대상 테이블에 외래 키가 있는 1 : 1 관계를 알아보겠습니다. 1 : 1 관계 중 대상 테이블에 외래 키가 있는 단방향 관계는 JPA에서 지원하지 않습니다. 그리고 이런 모양으로 매핑할 수 있는방법도 없습니다. 이때 단방향 관계를 LOCKER에서 MEMBER 방향으로 수정하거나, 양방향 관계로 만들고 LOCKER를 연관관계의 주인으로 설정해야 합니다. 참고로 JPA2.0 부터 1 : N 단방향 관계에서 대상 테이블에 외래 키가 있는 매핑을 허용했습니다. 하지만 1 : 1 단방향은 이런 매핑을 허용하지 않습니다. @Entity public class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; private St..