on
N대1 연관관계(@ManyToOne)
N대1 연관관계(@ManyToOne)
728x90
반응형
UserHistory Entity는 User Entity의 변경사항들을 저장하는 Entity이다.
그래서 1대N 관계(User 1 : UserHistory N)를 가진다.
@OneToMany 어노테이션에서 참조하는 값은 One에 해당하는 Entity의 PK(기본키)값을
Many에 해당하는 Entity에서 FK(외래키)로 갖는다.
Many에 해당하는 Entity에서 FK(외래키)로 갖는다. 일반적인 상황에서는 @ManyToOne 어노테이션이 깔끔하게 Entity를 구성한다.
해당 Entity가 필요로 하는 FK 엔티티가 함께 가지고 있기 때문이다.
[UserHistory.java]
@Entity @NoArgsConstructor @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class UserHistory extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @ManyToOne private User user; }
[User.java]
@NoArgsConstructor ... public class User extends BaseEntity { ... @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "user_id", insertable = false, updatable = false) @ToString.Exclude private List userHistories = new ArrayList<>(); ... }
[UserRepositoryTest.java]
@Test void userRelationTest(){ ... System.out.println("UserHistory.getUser() : " + userHistoryRepository.findAll().get(0).getUser()); }
UserHistory.getUser() : User(super=BaseEntity(createdAt=2021-10-03T21:02:18.209002, updatedAt=2021-10-03T21:02:18.650053), id=6, name=daniel, [email protected], gender=MALE)
JPA는 연관된 객체를 FK로 조회하는 것이 아니라 getter를 통해 가져오게 된다.
@OneToMany, @ManyToOne, 양방향 중 선택은 어느 엔티티에 연관 엔티티가 필요한지 알아야한다. UserHistory에 값을 조회해서 보면서 User 를 조회할 일은 거의 없다. User에서 변경이력을 보기 위해서 UserHistory를 조회할 일은 많다. User에서 @OneToMany를 활용해서 UserHistory에 연관관계를 맺는 것이 더 깔끔한 방법이다.
@ManyToOne, 양방향 중 선택은 어느 엔티티에 연관 엔티티가 필요한지 알아야한다.
반응형
from http://jeongsu1406.tistory.com/40 by ccl(A) rewrite - 2021-10-03 22:01:14