테이블
객체
외래키가 있는 곳(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 | 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다. |