twocowsong

연관관계의 주인(mappedBy) 본문

IT/JPA

연관관계의 주인(mappedBy)

WsCode 2022. 6. 11. 23:11

JPA 서적에는 없는내용입니다만 한번 정리하고 넘어가야할것같아 남기겠습니다.

mappedBy에 대하여 충분히 이해하셨다면 본글을 넘어가셔도 무방하십니다.

개인적으로는 mappedBy에 대하여 한번더 정리를 해야겠다고 판단 후 본 글을 작성하였습니다.

 

User(회원), OrderHobby(취미 주문), Hobby(취미) 3개의 엔티티가있습니다.

@Getter
@Setter
@Entity
@Table(name = "user")
public class User {

   @Id
   @GeneratedValue
   @Column(name = "user_id")
   private int id;

   private int age;
   private String name;
   private String address;

   @OneToMany(mappedBy = "user")
   private List<OrderHobby> orderHobby = new ArrayList<>();

}
@Getter
@Setter
@Entity
@Table(name = "order_hobby")
public class OrderHobby {

   @Id
   @GeneratedValue
   @Column(name = "order_hobby_id")
   private int orderHobbyId;

   @ManyToOne
   @JoinColumn(name = "user_id")
   private User user;

   @ManyToOne
   @JoinColumn(name = "hobby_id")
   private Hobby hobby;

}
@Getter
@Setter
@Entity
@Table(name = "hobby")
public class Hobby {
   @Id
   @GeneratedValue
   @Column(name = "hobby_id")
   private int hobbySeq;

   private String name;
   private int price;

   @Column(name = "class_cnt")
   private int classCnt;
}

 

User - OrderHobby - Hobby의 단계로 구성되어있습니다.

회원이 취미를 주문하면 OrderHabby에 INSERT되는 설계입니다.

 

USER 엔티티에서 주문한 취미를 보기위해 user.orderHobby를 추가하였습니다.

주문한 취미를 회원에서 조회할 수 있도록 mappedBy를 설정 하였습니다.

연관관계의 주인은 외래 키를 관리하는 엔티티를 효율적이므로 주인으로 선택합니다.

 

public static void test5(EntityManager em) {
   /////////////// 회원 명단 추가
   User user1 = new User();
   user1.setAge(20);
   user1.setName("Lee");
   user1.setAddress("서울");

   User user2 = new User();
   user2.setAge(30);
   user2.setName("Kim");
   user2.setAddress("부산");


   /////////////// 취미 클래스 추가
   Hobby golf = new Hobby();
   golf.setName("골프");
   golf.setPrice(200000);
   golf.setClassCnt(3);

   Hobby baseball = new Hobby();
   baseball.setName("야구");
   baseball.setPrice(150000);
   baseball.setClassCnt(3);

   /////////////// 회원이 취미 등록
   OrderHobby orderHobby1 = new OrderHobby();
   orderHobby1.setUser(user1);
   orderHobby1.setHobby(golf);

   OrderHobby orderHobby2 = new OrderHobby();
   orderHobby2.setUser(user2);
   orderHobby2.setHobby(golf);

   OrderHobby orderHobby3 = new OrderHobby();
   orderHobby3.setUser(user2);
   orderHobby3.setHobby(baseball);

   /////////////// 저장
   // 취미 클래스 저장
   em.persist(golf);
   em.persist(baseball);

   // 회원 저장
   em.persist(user1);
   em.persist(user2);

   // 취미 등록
   em.persist(orderHobby1);
   em.persist(orderHobby2);
   em.persist(orderHobby3);
}

 

조금 소스코드가 길긴하지만 프로세스는 간단합니다.

1. 회원정보 신규 추가

2. 취미정보 신규 추가

3. 회원별로 취미 추가

4. 저장

 

USER 테이블
ORDER_HOBBY 테이블
HOBBY 테이블

시퀀스로 생성되는 ID값은저와 다를수있습니다.

public static void test6(EntityManager em) {
   User user = em.find(User.class, 4);
   System.out.println(user.getName());

   List<OrderHobby> orderHobby = user.getOrderHobby();
   orderHobby.stream().forEach(hobby -> {
      Hobby saveHobby = em.find(Hobby.class, hobby.getHobby().getHobbySeq());
      System.out.println(saveHobby.getHobbySeq() + " : " + saveHobby.getName());
   });

}

회원 id를 조건으로 회원정보를 조회 후 user.getOrderHobby(); 를 이용하여 회원이 신청한 hobby를 얻을수 있습니다.

mappedBy를 이용하여 회원 정보만 조회했을 뿐인데도 orderHobby의 정보를 얻어올수 있었습니다.

'IT > JPA' 카테고리의 다른 글

일 대 다  (0) 2022.06.13
다 대 일  (0) 2022.06.12
정리  (0) 2022.06.09
실전 예제  (0) 2022.06.07
양방향 연관관계의 주의점  (0) 2022.06.06