반응형
지난 포스트에 이어 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 스샷 찍다가 생각났는데..
team_team_id 처럼 생성된 이유는 Member 객체 @ManyToOne 에 joinColumn 어노테이션을 주면 해결된다.
아무튼 그러해서 테스트는 이전 게시물과 동일하게 진행한다.
@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 된다.
*근데 사실 양방향이 아니라 단방향으로 각각 바라보는것 이라고 한다.
반응형
'개발 > JAVA' 카테고리의 다른 글
JPA n+1 정리 page, projection. (0) | 2022.10.27 |
---|---|
JPA N:1 단방향 맵핑 (0) | 2022.10.26 |
JPA 1:N 단방향 맵핑 (0) | 2022.10.26 |
Tomcat 에 사설 SSL 적용하기 (https 적용) (2) | 2018.02.13 |
java에서 JNI 를 이용하여 c 라이브러리(.so,.dll) 사용하기 (3) | 2017.10.15 |
댓글