본문 바로가기
개발/JAVA

JPA N:1 단방향 맵핑

by Shuming 2022. 10. 26.
반응형

지난 게시물에 이어 이번에는 N:1 단방향을 알아보자.

각설하고 바로 예제부터 보자.

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;

}


~중략
public class Member {

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

  private String name;

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "team_id")
  private Team team;
}

멤버와 팀 N:1로 단방향으로 매핑한다.

 

DB

 


여기서 유심히 봐야할 부분은 cascade 옵션이다.

 


설명하자면 Entity 객체가 생성,삭제,수정 등이 일어날 때 연관관계에 있는 Entity도 같이 영향을 받는다는건데.

아래 더 자세하게 잘 설명해둔 글을 보도록 하자.


casecade 옵션

  • CascadeType.PERSIST
    • 엔티티를 영속화 할 때 연관된 엔티티도 함께 유지 (* PERSIST의 예상치 못한 동작)
    • 연관 엔티티가 DB에 이미 저장이 되어있어도 다시 persist하기 때문에 detached entity passed to persist Exception이 발생함(이경우에는 CascadeType.MERGE를 사용)
  • CascadeType.MERGE
    • 엔티티 상태를 병합 할 때, 연관된 엔티티도 함께 병합
    • 트랜잭션이 종료되고 detach 상태에서 엔티티가 merge()를 수행하게 되면 연관 엔티티의 추가 및 수정사항도 함께 적용됨
  • CascadeType.REFRESH
    • 엔티티를 새로 고칠 때, 연관된 엔티티도 새로고침
  • CascadeType.REMOVE
    • 엔티티를 삭제할 때, 연관된 엔티도 함께 삭제
  • CascadeType.DETACH
    • 부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않음
  • CascadeType.ALL
    • 모든 Cascade 적용

출처: https://prohannah.tistory.com/132 [Hello, Hannah!:티스토리]


 

그럼 계속해서 부모1 자식2 를 만들어 테스트를 진행해보자

테스트는 아래와 같이 진행한다.

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

  @Autowired
  TeamRepository rpTeam;

  @Autowired
  MemberRepository rpMember;

  @Test
  public void test__() {

    System.out.println("영속성 전이를 통한 insert start");

    Team team = Team.builder().name("name of team").build();

    Member member1 = Member.builder()
        .name("name of member1")
        .team(team)
        .build();

    Member member2 = Member.builder()
        .name("name of member2")
        .team(team)
        .build();

    rpMember.saveAll(Arrays.asList(member1, member2));

    System.out.println("팀 전체 -------------------- ");
    rpTeam.findAll();
    System.out.println("멤버 전체 -------------------- ");
    rpMember.findAll();

  }
}

member를 save 하면서 team이 생성된다.

 

결과 member 2번 팀 1번. 굿

굿, 잘 만들어졌다.


 

반응형

'개발 > JAVA' 카테고리의 다른 글

JPA N+1, pageable, projection.  (0) 2022.10.28
JPA n+1 정리 page, projection.  (0) 2022.10.27
JPA 1:N 양방향 맵핑  (0) 2022.10.26
JPA 1:N 단방향 맵핑  (0) 2022.10.26
Tomcat 에 사설 SSL 적용하기 (https 적용)  (2) 2018.02.13

댓글