객체와 테이블 연관관계의 차이를 이해
객체의 참조와 테이블 외래 키 (FK) 를 매핑
연관관계의 주인 (OWNER)
각 매핑된 @Entity 어노테이션을 주석처리한다
테이블은 외래 키(FK)로 Join 해서 연관된 테이블을 찾는다
객체는 참조를 사용해 연관된 객체 를 찾는다
테이블과 객체 사이에는 이런 큰 간격이 있다.
회원 (MEMBER ) <-> 팀 (TEAM )
2 개의 테이블을 연관관계 할 것
회원은 하나의 팀에만 소속될 수 있다.
회원과 팀은 다대일 관계이다
JPA 객체 상으로는 연관되어 있지 않으나,
DB 테이블 상으로는 연관되어 있는 구조
JPA 에서 DATA를 수정함 과 동시에
DB에서는 연관되어 수정된다.
@Entity @Getter @Setter public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; }
@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; /* * FK 키 생성하기 * 연관관계로 Team 테이블 정보를 가져온다 * JoinColumn 은 name 을 반드시 명시해야한다 */ @ManyToOne // Team 클래스에서 "하나" 가져오기 @JoinColumn(name = "TEAM_ID") // 연관 컬럼 이어주기 , TEAM 명칭과 반드시 동일해야한다 private Team team; }
public class JpaMain { 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"); // em.persist = 영속상태로 전환 // 영속상태가 되면 PK의 값이 세팅된 이후, 영속상태로 전환된다. em.persist(team); Member member = new Member(); member.setName("member1"); // member.setTeam(team.getId()); // 영속상태로 전환 em.persist(member); // select // 어느팀 소속인지 알고 싶을 때 JPA 또는 DB에 계속 출력하여 찾아야한다. Member findMember = em.find(Member.class, member.getId()); // Long findTeamId = findMember.getteamId(); Team findTeam = em.find(Team.class, findTeamid); System.out.println("findTEAM 결과값 = " + findTeam.getName()); */ // 연관관계 매핑 시작 Team team = new Team(); team.setName("TeamA"); // em.persist = 영속상태로 전환 // 영속상태가 되면 PK의 값이 세팅된 이후, 영속상태로 전환된다. em.persist(team); Member member = new Member(); member.setName("member1"); 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(); } catch (Exception e) { tx.rollback(); }finally { em.close(); emf.close(); } } }