여기서 카테고리와 배송 엔티티는 추후에 추가하는 걸로 하고, 상품의 상속관계도 나중에 새롭게 추가하기로 하였다.
package hello.toyProject_1.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name ="member_id")
private Long id;
private String name;
@Embedded
private Address address;
// private Integer age;
// private String email;
// private String phoneNumber;
// private List<Order> orderList = new ArrayList<>();
}
- @Entity 어노테이션으로 JPA에서 엔티티로 관리하게 설정한다.
- @Getter, @Setter 은 lombok에서 지원하는 어노테이션
- @Id : 해당 값을 pk로 지정
- @GeneratedValue : JPA가 영속성 컨텍스트에 영속시킬 때 값을 자동으로 생성해준다.
- 주석 처리
추가적인 속성은 추후에 html 파일에 맞춰서 추가할 예정, 수업에서는 처음부터 양방향 관계로 설정했는데, 최대한 단방향으로 설계하고 필요시에 양방향으로 바꾸라고 배웠기 때문에 일단은 필요를 느낄 때까지 단방향만 설계해두고 진행할 것이다.
package hello.toyProject_1.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.List;
@Entity
@Getter
@Setter
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
@Column(name ="order_id")
private Long id;
@ManyToOne
@JoinColumn(name ="member_id")
private Member member;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
}
테이블 명을 orders로 설정한 이유는 java 프로그램 자체에 order이라는 무언가가 있기 때문에 그냥 order로 설정하면 오류가 발생한다.
컬럼명은 소문자,언더바(_)를 이용한다.
List를 ArrayList로 초기화하는 이유는 null오류 처리 등 장점이 있다는데 아직 잘 이해 못했다.
Member와는 단방향 관계, xToOne 은 지연로딩으로 설정을 바꿔줘야 하기에 FetchType을 LAZY로 설정했다.
package hello.toyProject_1.domain;
import hello.toyProject_1.domain.item.Item;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name ="orderItem_id")
private Long id;
@ManyToOne
@JoinColumn(name ="order_id")
private Order order;
@ManyToOne
@JoinColumn(name ="item_id")
private Item item;
private int count;
}
Member 와 Order 사이에서 다대다 관계를 일대다, 다대일로 풀어주는 역할
package hello.toyProject_1.domain;
import lombok.Getter;
import javax.persistence.Embeddable;
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipcode;
protected Address(){
}
public Address(String city, String street,String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
Adress 는 값타입으로 @Embeddable 어노테이션을 붙여뒀다.
값타입은 엔티티와는 다르게 뭔가 저장하고 수정하는 기능이 없다. 다른 엔티티에서 이 값타입을 선언하여 값타입에 저장된 변수들을 사용한다. 중복되는 코드를 줄이고 명확하게 변수들을 그룹핑할 수 있다는 장점이 있다.
JPA동작을 위해 기본 생성자가 필요하기 때문에 protected Address(){} 생성자를 작성하였다.
package hello.toyProject_1.domain.item;
import hello.toyProject_1.domain.OrderItem;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
public class Item {
@Id
@GeneratedValue
@Column(name ="item_id")
private Long id;
private String name;
private int stockQuantity;
private int price;
}