- 테이블에서 team_id와 team_id가 연결되어 있다면
- 객체에서는 teamId -> id 연결이 걸려있어야 한다.
Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamid;
}
@Entity
@Getter @Setter
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
DB에 저장, 조회하는 로직
DB관계 상 team이 만들어진 뒤 member가 할당
member1 이 소속된 팀 정보를 조회하려면 어떻게 해야하는가?
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Team team = new Team();
team.setName("TeamA");
// 영속상태가 되면, PK의 값이 세팅이 된 후 영속상태 된다.
em.persist(team);
Member member = new Member();
member.setName("member1");
// team이 영속성컨텍스트 안에있므로 DB에서 select해올 필요가 없다
member.setTeamid(team.getId());
em.persist(member);
// select
// 어느팀 소속인지 알고 싶을 때 jpa(영속성) or db에게 계속 물어봐야 한다.
// 최종적으로 Member가 속해있는 팀의 이름이 궁금하다!!
// db에서는 left join으로 알수있다.
// 해당 객체에 해당 키값을 넘겨서 findMember에 담아온다.
Member findMember = em.find(Member.class, member.getId());
// findMember에 팀의 아이디를 획득한 다음
Long findTeamid = findMember.getTeamid();
// 팀의 아이디를 가지고 팀객체에서 find해서 팀의 정보가 나오게되고
Team findTeam = em.find(Team.class, findTeamid);
// 팀의 정보에서 name을 가져오면 찾고자하는 member의 팀이름을 출력
System.out.println("findTeam : " + findTeam.getName());
// 영속성으로 들어감
tx.commit();
}catch (Exception e) {
tx.rollback();
}finally {
em.close();
emf.close();
}
}
- 중간에 위치한 이유는 영속성 컨텍스트에 먼저 보내고, db에 insert하기 때문이다.
- 1(Team) 대 다(Member) 관계
- Member라는 클래스는 Team이라는 클래스를 참조시켜버림
@ManyToOne
: 여기에선 Team이 하나@JoinColumn
: 관계 컬럼을 적어준다. TEAM_ID와 조인해야 한다.@ManyToOne
@JoinColumn
을 통해 멤버(Member)에서 팀(Team)을 참조하도록 했다. @Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- 대상이 되는 컬럼의 명칭을 매핑 시켜줘야 한다.
Team team = new Team();
team.setName("TeamA");
// 영속상태가 되면, PK의 값이 세팅이 된 후 영속상태 된다.
em.persist(team);
Member member = new Member();
member.setName("member1");
// Member에서 Team을 객체로 자체로 받아온다.
// 객체(Team) 자체를 세팅
member.setTeam(team);
em.persist(member);
// 강제로 DB 쿼리를 보고싶을때
em.flush();
em.clear();
// select 조회
// find시에 1차캐시에서 가지고 와서 select문이 없다.
Member findMember = em.find(Member.class, member.getId());
// 멤버세서 팀 객체를 통으로 받아와서 꺼내온다.
Team findTeam = findMember.getTeam();
System.out.println("findTeam : " + findTeam.getName());
// 영속성으로 들어감
tx.commit();