본문 바로가기
개발/JAVA

JPA 1:N 단방향 맵핑

by Shuming 2022. 10. 26.
반응형

 

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)
  @JoinColumn(name = "team_id")
  private List<Member> members;

}

~중략
public class Member {

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

  private String name;

}

 

 

1:N 구성이므로 Member에서 team_id를 참조해야한다.

DB

 

그리고 테스트는 아래와 같이 진행했다.

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

  @Autowired
  TeamRepository rpTeam;

  @Autowired
  MemberRepository rpMember;

  @Autowired EntityManager entityManager;

  @Test
  public void test__() {

    System.out.println("영속성 전이를 통한 insert start");
    Member member1 = Member.builder().name("name of member1").build();
    Member member2 = Member.builder().name("name of member2").build();
    rpMember.saveAll(Arrays.asList(member1, member2));

    Team team = Team.builder().name("name of team")
    .members(Arrays.asList(member1, member2))
    .build();
    rpTeam.save(team);

    entityManager.flush();
    System.out.println("영속성 전이를 통한 insert end");
~중략

 


결과

insert member 후에 insert team 까지는 정상적으로 이루어 졌는데 추가적으로 member에 대한 update가 2회 발생했다.

해당 현상에 대해 더 자세한 설명은 여기 를 참고 바란다.


* 대부분의 맵핑의 경우 단방향 으로 충분하지만 "영속성 전이"를 통한 insert 시 양방향 맵핑이 더 좋다! 라고합니다.

위 NHN 동영상에서 많은 내용 도움 받았습니다.

 

반응형

댓글