단방향 @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