TIL:) Entity 연관 관계

😃 Today I Leaned

  • SpringBoot

⭐알게 된 점⭐

Entity 연관 관계

  • DB 테이블에서는 테이블 사이의 연관관계를 FK로 맺을 수 있고 방향 상관없이 조회가 가능함
  • Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있음
  • 상대 Entity를 참조하고 있지 않다면 상대 Entity를 조회할 수 없음
  • Entity에서는 DB 테이블에는 없는 방향의 개념이 존재함

 

단방향 관계

// Food Entity
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
-------------------------------------------------------------
// User Entity
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}
  • Food Entity에서만 User Entity를 참조할 수 있음
  • User Entity에는 Food Entity의 정보가 없기 때문에 음식 정보를 조회할 수 없음

 

양방향 관계

// Food Entity
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
-------------------------------------------------------------
// User Entity
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Food> foodList = new ArrayList<>();
}
  • Food Entity와 User Entity는 서로를 참조하고 있음
  • 음식 : 고객 = N : 1 관계로 한명의 고객은 여러번 주문이 가능한 상황
  • 이를 Java 컬렉션을 사용하여 표현

 

1대 1 관계 ( @OneToOne )

  • 보통 N의 관계인 Entity가 외래 키의 주인이지만, 1대 1 관계에서는 외래 키의 주인을 직접 지정해야함
  • 외래키의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 아닌 쪽은 오직 읽기만 가능함
  • @JoinColumn()은 외래 키의 주인이 활용하는 어노테이션
  • 단방향 관계
// Food 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;
}
  • 양방향 관계
    • 외래 키의 주인을 지정해 줄 때 mapperBy 옵션을 사용
    • mapperBy의 속성값은 외래 키의 주인인 상대 Entity의 필드명을 사용
// Food 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;
}

1대 N 관계 ( @OneToMany )

N대 1 관계 ( @ManyToOne )

N대 M 관계 ( @ManyTo Many )


🐰 END

DB 테이블에서는 방향 상관없이 연관관계를 설정할 수 있었지만

Entity에서는 방향을 신경쓰면서 연관관계를 설정해야해서

많이 헷갈릴 것 같다.

아직 1대N관계와 N대 1 관계의 차이는 잘 모르겠다..!

BELATED ARTICLES

more