일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 캐쉬가능
- 멱등활용
- http
- JPA
- hibernate.dialect
- 네이버 연결된 서비스
- Git
- @Entity
- 김영한JPA
- 데이터베이스 방언
- org.apache.ibatis.binding.BindingException
- gitrevert
- SpringBoot
- RFC723x
- 매핑정보가없는필드
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- fixedDelay
- initialDelay
- KAKAOLOGINAPI
- 네이버로그인API
- HTTP3
- 무상태프로토콜
- anyMatch
- @Table
- 자바ORM표준프로그래밍
- Invalid bound statement (not found)
- gitreset
- DB방언
- Transaction not successfully started
- HTTPMESSAGE
Archives
- Today
- Total
twocowsong
연관관계의 주인(mappedBy) 본문
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. 저장
시퀀스로 생성되는 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의 정보를 얻어올수 있었습니다.