1 대 N 관계

금은체리·2023년 11월 17일
1

Spring

목록 보기
31/49

@OneToMany

  • @OneToMany 애너테이션은 1 대 N 관계를 맺어주는 역할
  • 음식 Entity와 고객 Entity가 1 대 N 관계라 가정

단방향 관계

  • 외래 키를 관리하는 주인은 음식 Entity이지만 실제 외래 키는 고객 Entity가 가지고 있음

    • 1 : N에서 N 관계의 테이블이 외래 키를 가질 수 있기 때문에 외래키는 N 관계인 users 테이블에 외래키 칼럼을 만들어 추가하지만
    • 외래키의 주인인 음식 Entity를 통해 관리
    • 음식
    @Entity
    @Table(name = "food")
    public class Food {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private double price;
    
        @OneToMany
        @JoinColumn(name = "food_id") // users 테이블에 food_id 컬럼
        private List<User> userList = new ArrayList<>();
    }
    • 고객
    @Entity
    @Table(name = "users")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
    }
  • 외래키를 음식 Entity가 직접 가질 수 있다면 INSERT 발생시 한 번에 처리 가능

  • 실제 DB에서 외래키를 고객 테이블이 가지고있기 때문에 추가적인 UPDATE가 발생된다는 단점 존재


양방향 관계

  • 1 대 N 관계에서는 일반적으로 양방향 관계 존재X
  • 1 대 N 관계에서 양방향 관계를 맺으려면 음식 Entity를 외래키의 주인으로 정해주기 위해
  • 고객 Entity에서 mappedBy 옵션을 사용해야 하지만
  • @ManyToOne 애너테이션은 mappedBy 속성 제공 X
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

		@ManyToOne
		@JoinColumn(name = "food_id", insertable = false, updatable = false)
		private Food food;
}
  • N 관계의 Entity인 고객 Entity에서 @JoinColum의 insertable과 updatable 옵션을 false로 설정하여
  • 양쪽으로 JOIn 설정 하면 양방향처럼 설정할 수는 있음
profile
전 체리 알러지가 있어요!

0개의 댓글