⏰ 2024. 05. 29 수
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
N:1 관계
@ManyToOne
애너테이션은 N:1 관계를 맺어주는 역할을 한다.@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "entity2_id")
private Entity2 entity2;
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "entity2_id")
private Entity2 entity2;
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "entity2")
private List<entity1> entity1List = new ArrayList<>();
}
1:N 관계
@OneToMany
애너테이션은 1:N 관계를 맺어주는 역할을 한다.@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "entity1_id") // entity2 테이블에 entity1_id 컬럼
private List<Entity2> entity2List = new ArrayList<>();
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
mappedBy
옵션을 사용해야 하지만 @ManyToOne
애너테이션은 mappedBy
옵션을 제공하지 않는다.@JoinColum
의 insertable
과 updatable
옵션을 false로 설정하여 양쪽으로 JOIN 설정을 하면 양방향처럼 설정할 수는 있다. ❗ 권장하지 않음@JoinColumn(name = "entity1_id", insertable = false, updatable = false)
N:M 관계
@ManyToMany
애너테이션은 N:M 관계를 맺어주는 역할을 한다.@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "midEntity", // 중간 테이블 생성
joinColumns = @JoinColumn(name = "entity1_id"), // 현재 위치인 Entity1 에서 중간 테이블로 조인할 컬럼 설정
inverseJoinColumns = @JoinColumn(name = "entity2_id")) // 반대 위치인 Entity2 에서 중간 테이블로 조인할 컬럼 설정
private List<Entity2> entity1List = new ArrayList<>();
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "midEntity", // 중간 테이블 생성
joinColumns = @JoinColumn(name = "entity1_id"), // 현재 위치인 Entity1 에서 중간 테이블로 조인할 컬럼 설정
inverseJoinColumns = @JoinColumn(name = "entity2_id")) // 반대 위치인 Entity2 에서 중간 테이블로 조인할 컬럼 설정
private List<Entity2> entity2List = new ArrayList<>();
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "entity2List")
private List<Entity1> entity1List = new ArrayList<>();
}
@ManyToMany
로 Entity1을 연결하고, mappedBy
옵션을 설정하여 외래키의 주인을 설정하면 양방향 관계 맺음이 가능하다.@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "entity1")
private List<MidEntity> midEntityList = new ArrayList<>();
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "entity2")
private List<MidEntity> midEntityList = new ArrayList<>();
}
@Entity
@Table(name = "midEntity")
public class MidEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "entity1_id")
private Entity1 entity1;
@ManyToOne
@JoinColumn(name = "entity2_id")
private Entity2 entity2;
}