----day10
com.codingbox.jpaitem라는 새로운 프로젝트 만든다.
롬복, 오라클 드라이버, 스프링 데이터 JPA 이 3가지 드라이버만 가지고 온다.
오늘 배운 걸로 시험볼 것이다.
똑같이 풀어주고 jpa프로젝트에서 헀던 META_INF라는 폴더와 그안에 파일을 통 째로 복붙해서 이번에 만든 거에 넣어줬다.
회원이 여러 주문을 넣고 하나의 주문에는 여러개의 주문 상품이 있을 것임.
com.codingbox.jpaitem.domain패키지 만듦
그아래에 4개 만듦
메인 메서드 만들어서 자바어플리케이션으로 실행해주면 테이블이 만들어진다. 디비버가서 엔티티관계도 보고 확인하자
여기까지하면 테이블은 만들었고 보면 FK가 안만들어져있다.
DB에선 팀에서 멤버를 갖는다거나 반대로 멤버에서 팀을 조인하거나 할 수 있다.
이걸 객체에서도 하고싶다!
테이블입장 즉 DB입장에서는 1개이다. FK하나를 가지고말이다.
실선과 점선이 둘다 있는 것이 양방향 연관관계를 의미한다.
주인인곳에서 아닌쪽 -> 실선
주인아닌곳 에서 주인인곳 -> 점선
---------------점심
순수 객체 상태를 고려해서 항상 양쪽에 값을 설정해야한다.
근데 항상 이렇게 2번하기 깜빡할 수 있으니까 연관관계 편의 메서드를 생성해 줄것이다.
외부에서 처리되도록 하는 메서드
롬복에서는 게터, 세터, toString등 알아서 만들어 준적이 있다.
Member 안에 있는 toString안에는 team의 toString() 을 호출하고 team 의toString()은 Member 안에 있는 toString()을 호출하게되면서 무한루프가 된다.
양방향 매핑시에 무한 루프를 조심해야한다(예 : toString(), lombok, ...)
비즈니스 로직을 기준으로 연관관계의 주인을 선택하면 안된다.
연관관계의 주인은 외래키의 기준으로 정해야한다.
오늘거 아닌쪽에 MappedBy를 검색해야한다.
오늘꺼 대로하면 무한스택플로우 에러가 난다
팀에서는 멤버를 호출하고 투스트링으로
멤버에서는 팀을 호출하는 투스트링이있어서 서로 부르니까 무한이다
하나만 주석처리하면 된다.
---day11 시작
Order와 Member관계만 먼저보자
Order의 member : Member가 Member테이블의 id를 참조하고있으므로 Member테이블이 FK를 가지녀 Owner가 되고 Member테이블이 mappedBy가 된다.
추가로 어감이 좋은 Owner가 @ManyToOne이 되며 이거만 걸면 단방향 매핑이된다.
양방향 매핑을 위해 어감이 안좋은 @OneToMany는 mappedBy의 Member 테이블에 추가를 하면 된다.
이거 중요한 거니까 코드를 추가한다.
//패키지, 임포트 부분 생략했다.
//@Entity
@Getter @Setter
@Table(name="orders")
public class Order {
//Order라는 것이 DB마다 예약어로 걸려있는 경우가 있으니 이름을 바꾸자
@Id
@GeneratedValue
@Column(name="ORDER_ID")
private Long id;
// @Column(name="MEMBER_ID") //Member.java에서의 @Id칼럼이름과 동일하게해야 한다.
// private Long memberId;
@ManyToOne
@JoinColumn(name="MEMBER_ID")
private Member member;
private LocalDateTime orderDate;
private String status;
}
나머지 2개추가로 매핑하는 것도 위와 같게 하면 된다.