
객체의 참조와 테이블의 외래키 매핑
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
private int age;
@Enumerated(EnumType.STRING)
private MemberType type;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
public void createMember(Team team) {
this.team = team;
team.getMembers().add(this);
}
@Enumerated(EnumType.STRING)
private MemberType memberType;
}
객체지향 모델링
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
객체 그래프 탐색 및 수정
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
// 새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
// 회원1에 새로운 팀B 설정
member.setTeam(teamB);

양방향 매핑(팀 엔터티에 @OneToMany 추가)
@Entity
@Setter
@Getter
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@BatchSize(size = 100)
@OneToMany(mappedBy = "team")
private List<Member>members = new ArrayList<>();
}
연관관계의 주인
mappedBy 속성으로 주인 지정다(여기서는 Member) 쪽에 설정하는 것이 좋다단방향

양방향

일대다 단방향

일대다 단방향은 일대다에서 일이 연관관계의 주인
테이블 일대다 관계에서는 항상 다 쪽에 외래키가 있음
@JoinColumn을 사용하지 않으면 조인테이블 방식을 사용하여 중간에 테이블을 하나 추가함
단점
mappedBy 적용주요 에노테이션
@Inheritance(strategy=InheritanceType.xxx)Joined: 조인 전략Single Table: 단일 테이블 전략Table_Per_class: 구현 클래스마다 전략@DiscriminatorColumn(name="DTYPE")@DiscriminatorValue("XXX")조인 전략

단일 테이블 전략

구현 클래스마다 전략

상속 매핑 예시
@Entity
@Setter
@Getter
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
@Setter
@Getter
@ToString
@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
}
@MappedSuperclass
공통 매핑 정보가 필요할 때 사용
테이블과 관계 없고 단군히 엔터티가 공통으로 사용하는 매핑정보를 모으는 역할
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔터티에서 공통으로 적용하는 정보를 모을 때 사용
사용 예시
BaseEntity Test
@MappedSuperclass
@Setter
@Getter
public class BaseEntity {
@Column(name="created_by")
private String createdBy;
private LocalDateTime createdTime;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Test extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String name;
}
실행 결과 테스트 테이블
