[Spring] JPA 애너테이션, 관계 매핑
<JPA 애너테이션>
앤티티 클래스에서
@Getter, @Setter, @NoArgsConstructor, @Entity 를 붙여줌.
@Entity : 이 객체가 entity 객체라는 것을 알려줘야 함.
기본생성자가 없으면 오류가 발생하므로 @NoArgsConstructor 를 넣어 주어야 함.
@GerneratedValue : 자동으로 기본키가 생성되는 전략임. 기본 설정은 데이터베이스 테일블에 맡김.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long coffeeId;
- GenerationType
1. Identity: 기본키생성을 데이터베이스에 위임한다. AUTO_INCREMENT 보통 JPA, MYsql 사용시 설정.
2. Sequence : DB의 시퀀스를 활용하여 id 값을 증가시킨다.
@Column
- length : 문자 길이 제약조건.
- nullable
- unique
- updatable
- name : 필드와 매핑할 테이블 컬럼의 이름.
@Enumerated : Enum 타입을 사용할 때.
- EnumType.ORDINAL : 순서값을 저장.
- EnumType.STRING : 이름을 저장.
@Enumerated(value = EnumType.STRING)
@Column(length = 20, nullable = false)
private CoffeeStatus coffeestatus = CoffeeStatus.COFFEE_FOR_SALE;
<관계 매핑>
- 매핑을 하는 이유: DB의 테이블과 연결 시키기 위해서.
- 다대일 매핑부터!
- 다에는 클래스 객체 자체가 있어야 함. @ManyToOne
- @JoinColum(name = "") >> 조인할 테이블의 기본키.
- 필요한 상황에 일대다 매핑.
☘️ Coffee 와 order 의 관계에서
이 둘은 다대다 이기 때문에 중간 조인테이블 OrderCoffee 가 있어야 함.
시작은 다대일부터 . OrderCoffee >> Coffee 로, OrderCoffee >> Order 로 다대일 매핑을 함.
- 외래키 기준으로 생각! 외래키를 가지고 있는 테이블에서, 즉 객체를 가지고 있는 테이블에서 조회가 가능한 것임.
근데 Order 에서 coffee 를 조회할 수 있어야 하기 때문에, Order >> OrderCoffee 로 일대다 매핑이 필요.
그렇게 하면 Order 에서 OrderCoffee 로, OrderCoffee 에서 Coffee 로 조회가 가능해진다.
서로가 서로를 호출하려면 this 가 필요함.
@OneToMany 는 mappedBy 를 써주는데 이때에는 관계를 이어줄 테이블 명을 써 주어야 함.
@OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST)
private List<OrderCoffee> orderCoffees = new ArrayList<>();
public void addOrderCoffee(OrderCoffee orderCoffee) {
this.orderCoffees.add(orderCoffee);
if (orderCoffee.getOrder() != this) {
orderCoffee.addOrder(this);
}
}