- 즉시로딩
- 객체 A를 조회할 때 A와 연관된 객체들을 한번에 가져오는것.
- 지연로딩
- 객체 A를 조회할 때는 A만 가져오고 연관된 데이터는 프록시 초기화 방법으로 가온다.
public class Member{
@ID
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USER_NAME")
private String userName;
@ManyToOne
@JonColumn(name = "TEAM_ID")
private Team team;
}
public class Team{
@ID
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "TEAM_NAME")
private String name;
}
Team team = new Team();
team.setName("team01");
em.persist(team);
Member member = new Member();
member.setUserName("user01");
member.setTeam(team);
em.persist(member);
//DB에 쿼리를 보고싶을때 flush(), clear() 사용
em.flush(); //영송성컨텍스트에 있는 데이터를 DB에 쿼리를 날린다(싱크 맞춤)
em.clear(); //영속성 컨텍스트 초기화
//조회
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
//수정
Team newTeam = em.find(Team.class, 100L);
findMember.setTeam(newTeam)
public class Member{
@ID
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USER_NAME")
private String userName;
@ManyToOne
@JonColumn(name = "TEAM_ID")
private Team team;
//Member domain 에 편의 메소드 생성한다//
public void changeTeam(Team team){
this.team.team;
team.getMembers().add(this)
}
}
public class Team{
@ID
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "TEAM_NAME")
private String name;
@OneToMany(mappedBy = "tema")
private List<Member> members = new ArrayList<>();
//연관관계 편의 매서드//
public void addMember(Meber meber){
member.setTeam(this);
member.add(member);
}
}
//Team.class//
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
mappedBy
가짜매핑
객체와 테이블이 관계를 맺는 차이
객체 연관관계 = 2
객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다
객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
테이블 연관관계 = 1
회원 <-> 팀의 연관관계 1개(양방향)
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
연관 관계 주인 설정
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member meber = new Member();
member.setUsername("member1");
member.setTeam(team);//연관관계의 주인에 값 설정
em.persist(member);
em.flush();
em.clear();
양방향 연관관계 주의
//Member domain 에 편의 메소드 생성한다//
public void changeTeam(Team team){
this.team.team;
team.getMembers().add(this)
}
//Team domain 연관관계 편의 매서드//
public void addMember(Meber meber){
member.setTeam(this);
member.add(member);
}
엔티티 조회 시 연관관계에 있는 데이터까지 한 번에 조회해오는 기능
@ManyToOne(fetch = FetchType.LAZY) 옵션으로 지정할 수 있다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member; //주문 회원
즉시 로딩으로 조회된 엔티티의 연관관계 필드에는 실제 엔티티가 객체가 변환된다.
주의사항