테이블
객체

외래키가 있는 곳(Many쪽)이 주인이 되어야 함.
가장 많이 사용하는 연관관계이다.
일대다의 반대이다.

Team쪽에 List members 추가하면 양방향.
주인이 바뀌는 것이 아니므로 추가한다고 테이블에 영향주지 않음.

@Entity
public class Team {
@OneToMany
@JoinColumn(name = "TEAM_ID")
List<Member> members = new ArrayList<>();
}
public static void main() {
Member member = new Member();
member.setUserName("member1");
em.persist(member);
Team team = new Team();
team.setName("teamA");
team.getMembers().add(member); // Member 테이블의 FK가 업데이트 되어야함.
// Team 테이블을 Update하며 어쩔수 없이 Member 테이블도 Update 해줘야해서 어쩔수없이 쿼리가 한번 더 실행됨.
em.persist(team);
}


@Entity
public class Locker {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member {
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}

@Entity
public class Locker {
@Id @GeneratedValue
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
@Entity
public class Member {
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}


단방향 예제
@Entity
public class Product {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member {
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
private List<Product> products = new ArrayList<>();
}
MemberProduct@Entity
public class MemberProduct {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
@Entity
public class Member {
@OneToMany(mappedBy = "member")
private List<MemberProduct> memberProducts = new ArrayList<>();
}
@Entity
public class Product {
@OneToMany(mappedBy = "product")
private List<MemberProduct> memberProducts = new ArrayList<>();
}
| 속성 | 설명 | 기본값 |
|---|---|---|
| name | 매핑할 외래 키 이름 | 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 |
| referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본 |
| 키 컬럼명 | ||
| foreignKey(DDL) | 외래 키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다. | |
| unique,nullabl,insertable,updatable,columnDefinition,table | @Column의 속성과 같다. |
| 속성 | 설명 | 기본값 |
|---|---|---|
| optional | false로 설정하면 연관된 엔티티가 항상 있어야 한다. | TRUE |
| fetch | 글로벌 페치 전략을 설정한다. | |
| cascade | 영속성 전이 기능을 사용한다. | @ManyToOne=FetchType.EAGER @OneToMany=FetchType.LAZY |
| targetEntity | 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다. |
| 속성 | 설명 | 기본값 |
|---|---|---|
| mappedBy | 연관관계의 주인 필드를 선택한다. | |
| fetch | 글로벌 페치 전략을 설정한다. | |
| cascade | 영속성 전이 기능을 사용한다. | @ManyToOne=FetchType.EAGER @OneToMany=FetchType.LAZY |
| targetEntity | 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다. |