일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Firebase authentication apple login
- Spring boot swagger blank screen
- 소개팅앱 만들기 flutter
- Android apple login 인증서 설정
- stable-diffusion-webui local 접속
- 주 4일 근무제 경험담
- supabase storage feature not enabled for this tenant
- 주 4일 근무제
- DT_TOOLCHAIN_DIR cannot be used
- Spring google SMTP settings
- 소개팅앱 만들기 stomp
- supabase edge function deploy error supabaseurl is required
- supabase storage public url not working
- Firebase authentication apple login 최신
- Android apple login identifier
- 로컬 서버 접속
- stable-diffusion-webui local 네트워크에서 접속
- Supabase edge function
- Supabase edge function insert data
- Firebase authentication android apple login
- 소개팅앱 만들기
- Stomp socket connection event
- 주 4일 근무제 log
- Spring LocalDateTime response array
- Stomp user connection event
- no such module '__ObjC'
- Firebase authentication android apple login setting
- supabase edge function deploy error
- Android apple login
- invite user for supabase project
Archives
- Today
- Total
꿀맛코딩
연관관계 매핑 기초 본문
객체를 테이블에 맞추어 데이터 중심으로 모델링 하면, 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이런 큰 간격이 있다.
단방향 연관관계
객체 지향 모델링
(객체 연관관계 사용)
객체 지향 모델링
(객체의 참조와 테이블의 외래 키를 매핑 )
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@Column(name = "TEAM_ID")
private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
객체 지향 모델링
(ORM 매핑)
객체 지향 모델링
(연관관계 저장)
//팀 저장
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);
양방향 연관관계와 연관관계의 주인
양방향 매핑
양방향 매핑
(Member 엔티티는 단방향과 동일)
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
......
양방향 매핑
(Team 엔티티는 컬렉션 추가)
@Entity
public class Team {
private String name;
}
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
...
양방향 매핑
(반대 방향으로 객체 그래프 탐색)
//조회
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //역방향 조회
연관관계의 주인과 mappedBy
둘중 주인은?
- 외래 키가 있는 곳을 주인으로 정해야함
- 여기서는 Member.team 이 연관관계의 주인
양방향 매핑시 가장 많이 하는 실수
(연관관계의 주인에 값을 입력하지 않음)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
양방향 매핑시 연관관계의 주인에 값을 입력 해야 한다.
(순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력 해야 한다.)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //중요
team.getMembers().add(member); //연관관계의 주인에 값 설정 (읽기 전용 값이라 실제로 쿼리가 날라가지 않음)
em.persist(member);
반응형
Comments