Spring Boot JPA 2 - 연관관계 테이블

UnKnown12·2022년 12월 7일
0

Spring Boot

목록 보기
6/13

📌 연관관계 매핑

  • 객체와 테이블 연관관계의 차이를 이해

  • 객체의 참조와 테이블 외래 키 (FK) 를 매핑

  • 연관관계의 주인 (OWNER)

  • 각 매핑된 @Entity 어노테이션을 주석처리한다

  • 테이블은 외래 키(FK)로 Join 해서 연관된 테이블을 찾는다

  • 객체는 참조를 사용해 연관된 객체 를 찾는다

  • 테이블과 객체 사이에는 이런 큰 간격이 있다.

❗ EX ) 예시

  • 회원 (MEMBER ) <-> 팀 (TEAM )
    2 개의 테이블을 연관관계 할 것

  • 회원은 하나의 팀에만 소속될 수 있다.

  • 회원과 팀은 다대일 관계이다

  • JPA 객체 상으로는 연관되어 있지 않으나,
    DB 테이블 상으로는 연관되어 있는 구조
    JPA 에서 DATA를 수정함 과 동시에
    DB에서는 연관되어 수정된다.

📌 TEAM 테이블

상위 테이블

@Entity
@Getter @Setter
public class Team {

	@Id @GeneratedValue
	@Column(name = "TEAM_ID")
	private Long id;
	private String name;
	
}

📌 Member 테이블

하위 테이블

@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;
}

📌 JPA Main 연관관계 생성

Main 메소드를 통해 TEAM 테이블과 MEMBER 테이블을 연관시킨다

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();
		}
		
	}
}
profile
Hyobin12

0개의 댓글