단방향 @ManyToOne 관계
객체의 다대일 관계에서 ‘다’에 해당하는 클래스의 ‘일’에 대한 참조변수에 @ManyToOne 을 마킹한다.
아래는 ‘사람은 여러대의 차동차를 소유한다’는 관계에서 Car 클래스에서 Human 클래스를 참조하도록 설계한 코드이다.
객체간의 관계에서 Car가 Human을 참조하므로 Car가 ‘주인’이 되고, 테이블이 생성된 결과를 보면 Car 테이블에 Human의 id(owner_id)가 FK로 추가되었다.
@Entity
@Getter
@Setter
public class Car {
@Id @GeneratedValue
Long Id;
String type;
int number;
@ManyToOne
Human owner;
}
@Entity
@Getter
@Setter
public class Human {
@Id @GeneratedValue
Long id;
String name;
}
create table car (
id int8 not null,
number int4 not null,
type varchar(255),
owner_id int8,
primary key (id)
)
create table human (
id int8 not null,
name varchar(255),
primary key (id)
)
alter table if exists car
add constraint FK7usexgac8wqir899vr8fa5c9f
foreign key (owner_id)
references human
단방향 @OneToMany 관계
객체의 관계중 일대다의 관계에서 ‘일’에 해당하는 클래스의 ‘다’ 참조변수에 @OneToMany 를 마킹하여 관계를 표현한다. @ManyToOne에서 Many쪽 테이블에 FK를 추가하는 것과는 다르게 관계테이블이 추가된다.
아래에서는 human_cars 라는 관계테이블이 생성되었고 Car와 Human의 키를 FK로 갖는다.
Human 객체의 cars 변수에 유효한 car 객체를 참조하는 경우 human_cars 테이블에 자동으로 값이 저장된다.
@Entity
@Getter
@Setter
public class Human {
@Id @GeneratedValue
Long id;
String name;
@OneToMany
List<Car> cars;
public List<Car> getCars() {
if(cars == null){
this.cars = new ArrayList<>();
}
return cars;
}
}
@Entity
@Getter
@Setter
public class Car {
@Id @GeneratedValue
Long Id;
String type;
int number;
}
create table car (
id int8 not null,
number int4 not null,
type varchar(255),
primary key (id)
)
create table human (
id int8 not null,
name varchar(255),
primary key (id)
)
create table human_cars (
human_id int8 not null,
cars_id int8 not null
)
alter table if exists account
add constraint UK_gex1lmaqpg0ir5g1f5eftyaa1 unique (username)
alter table if exists human_cars
add constraint UK_nbcgeg2leb25dljpgvy0o8xgo unique (cars_id)
alter table if exists human_cars
add constraint FK7xsccvk95s6isrkex02hcj2n5
foreign key (cars_id)
references car
양방향 관계
객체 관계 설정시 @OneToMany와 @ManyToOne을 동시에 설정하면 양방향 관계가 맺어진다. 이 때는 단방향 @OneToMany에 자동생성된 관계테이블은 생성되지 않고 @ManyToOne이 설정된 클래스의 테이블이 FK를 갖는다. (FK를 갖는쪽을 관계의 오너(Owner)라 한다.)
오너(Owner) 클래스가 Car이므로 Human 클래스의 @OneToMany에 mappedBy 속성을 부여해야 한다. mappedBy에 키 프로퍼티를 적어주지 않으면 양방향이 아니라 단방향 관계가 2개 생성됨에 주의한다.
@Entity
@Getter
@Setter
public class Car {
@Id @GeneratedValue
Long Id;
String type;
int number;
@ManyToOne
Human owner;
}
@Entity
@Getter
@Setter
public class Human {
@Id @GeneratedValue
Long id;
String name;
@OneToMany(mappedBy = "owner")
List<Car> cars;
public List<Car> getCars() {
if(cars == null){
this.cars = new ArrayList<>();
}
return cars;
}
}
create table car (
id int8 not null,
number int4 not null,
type varchar(255),
owner_id int8,
primary key (id)
)
create table human (
id int8 not null,
name varchar(255),
primary key (id)
)
alter table if exists car
add constraint FK7usexgac8wqir899vr8fa5c9f
foreign key (owner_id)
references human