Spring
스파르타 부트캠프 Spring Master 3강 Entity @OneToOne 단방향, 양방향 정리
H.S-Backend
2024. 5. 28. 20:06
1대 1관계
@OneToOne (1대 1 관계를 맺어주는 역할)
Entity에서 외래키의 주인은
일반적으로 N(다수)의 관계 Entity이지만
1대1관계 에서는 외래키의 주인을 직접 지정해야한다.
외래키를 가지고있는 클래스만이
외래키를 등록, 수정, 삭제할 수 있고
아닌쪽은 읽는 것만 가능하다.
@JoinColumn() 은
외래 키의 주인이 활용하는 에너테이션이다.
컬럼명, Null여부, Unique여부 등 지정할 수 있다.
@OneToOne
@JoinColumn(name = "user_id")
private User user;
Food Entity가 외래키의 주인인 경우
@Entity
@Getter
@Setter
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
@Entity
@Getter
@Setter
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
고객 Entity가 외래키 주인인 경우
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
}
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "food_id")
private Food food;
}
@OneToOne 에너테이션 밑에
@JoinColumn을 가지고 외래키의 주인이 활용하는 에너테이션
양방향 관계
외래키 지정시 mappedBy 옵션을 사용한다.
외래키의 주인인 상대 Entity필드명을 의미한다
관계 설정 방법
단방향은
외래 키의 주인만
상대 Entity 타입의 필드를 가지며
JoinColumn()을 활용하여 외래키 속성을 설정해준다.
@OneToOne
@JoinColumn(name = "user_id")
private User user;
양방향은
외래키의 주인은
상대 Entity 타입의 필드를 가지면서
JoinColumn()을 활용하여 외래 키의 속성을 설정해준다.
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
상대 Entity는
외래 키의 주인 Entity 타입의 필드를 가지면서
mappedBy 옵션을 사용하여 속성 값으로
외래 키의 주인 Entity에 선언된
JoinColumn()으로 설정되고 있는 필드명을 넣어주면된다.
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "user")
private Food food;
외래키의 주인 Entity에서 @JoinColumn()은 default옵션으로 생략이 가능하다
하지만 1대 N 관계에서는 JoinColumn을 생략하면
중간테이블이 생성된다.
똑같이 양방향 관계에서 mappedBy옵션을 생략하면
중간테이블이 설정된다.
Jpa가 외래키를 찾을 수 없기에 기본으로 생성해두자
음식 Entity가 외래키 주인 인 경우
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "user")
private Food food;
}
@OneToOne 양방향
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "user")
private Food food;
public void addFood(Food food) {
this.food = food;
food.setUser(this);
}
양방향에서
Food테이블이 외래키를 기본적으로 갖고 있으며
maapedBy를 사용하여 user필드를 가져와서 양방향이 되고
User 클래스에서
addFood 클래스를 생성하여
food.setUser를 사용하여 (this = User를 지칭)
함으로
User에서도 Food를 가져올 수 있게 할 수 있다.
반응형