본문 바로가기
개발/JAVA

JPA 1:N 양방향 맵핑

by Shuming 2022. 10. 26.
반응형

지난 포스트에 이어 JPA 1:N 양방향을 알아보자.

테스트용 객체 Team (1) : Member (N) 을 아래와 같이 구성한다.

 

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "TEAM")
public class Team {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "team_id")
  private Long id;

  private String name;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
  private List<Member> members;

}


public class Member {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "member_id")
  private Long id;

  private String name;

  @ManyToOne
  private Team team;
}

이전 게시물에서는 Member에 team_id만 있었지만 양방향 참조관계이므로 @ManyToOne 어노테이션을 붙여준다.

아울러 Team 객체에는 mappedBy 라는 옵션값을 주어 주인관계를 설정한다.

여기서 mappedBy에 적혀있는 team 은 Member객체에 있는 @ManyToOne 어노테이션으로 지정된 team을 가리킨다.

*연관관계의 주인은 Member 이기 때문이다.

 

db


아 근데 DB 스샷 찍다가 생각났는데.. 

team_team_id 처럼 생성된 이유는 Member 객체 @ManyToOne 에 joinColumn 어노테이션을 주면 해결된다.

team_team_id > team_id

 


아무튼 그러해서 테스트는 이전 게시물과 동일하게 진행한다.

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class N1ProblemTest {

  @Autowired
  TeamRepository rpTeam;

  @Autowired
  MemberRepository rpMember;

  @Autowired EntityManager entityManager;

  @Test
  public void test__() {

    System.out.println("------------------------");
    Team team = Team.builder().name("team").build();
    Member member1 = Member.builder().name("member").team(team).build();
    Member member2 = Member.builder().name("member").team(team).build();
    team.setMembers(Arrays.asList(member1, member2));
    
    rpTeam.save(team);
    System.out.println("------------------------");
    
~중략

 

요로코롬..


결과

1:N 단방향에서는 업데이트 쿼리 까지 날아갔었지만

양방향 참조가 된 이후로 정상적으로 update 된다.

 

 

*근데 사실 양방향이 아니라 단방향으로 각각 바라보는것 이라고 한다.

반응형

댓글