OneToMany 애노테이션의 mappedBy 설정 관련 (JPA 양방향 관계 설정)

345 views
Skip to first unread message

namkyu Lee

unread,
May 8, 2017, 1:26:41 AM5/8/17
to Korea Spring User Group Q&A

JPA의 양방향 관계 설정 테스트 코드를 작성하면서 이해되지 않는 부분이 있어 글 올립니다.
아래와 같은 테스트 코드를 작성하여 실행해 보면 memberList의 size가 0으로 나와 테스트 실패됩니다.
문제가 될 만한 부분은 없어 보이는데 어떤 이유에서 0건으로 나오는지 모르겠네요.



@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class MappingTest {

    @PersistenceContext
    private EntityManager entityManager;
   
    @Test
    @Transactional
    public void testTwoway() {
        Team team = new Team();
        team.setName("MyTeam");
        entityManager.persist(team);

        Member p1 = new Member();
        p1.setName("user1");
        p1.setTeam(team);
        entityManager.persist(p1);

        Member p2 = new Member();
        p2.setName("user2");
        p2.setTeam(team);
        entityManager.persist(p2);

        Team resultDepart = entityManager.find(Team.class, 1L);
        Collection<Member> memberList = resultDepart.getMembers();
        assertThat(2, is(memberList.size()));
    }    

    
    @Data
    @Entity
    private class Member {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;

        private String name;
        
        @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
        @JoinColumn(name = "TEAM_ID")
        private Team team;
    }

    @Data
    @Entity
    private class Team {

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

        private String name;
        
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "team")
        private Collection<Member> members = new ArrayList<>();
    }


}





Kyung Won Lee

unread,
May 8, 2017, 3:40:09 AM5/8/17
to Korea Spring User Group Q&A
p1.setTeam, p2.setTeam으로 연관관계 매핑 한 후에 team을 다시한번 persist해보시면 될거같은데요. 

연관관계 후 update가 안되서 그런거 같습니다. EntityManager.persist는 save, update, patch가 될겁니다.

2017년 5월 8일 (월) 오후 2:26, namkyu Lee <lng...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
https://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/f11eeecf-0072-4c20-82bc-5f434a588ac8%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

Kyung Won Lee

unread,
May 8, 2017, 3:57:30 AM5/8/17
to Korea Spring User Group Q&A
아 다시 보니 아니네요. Team.members에 연관관계 매핑이 되지 않아서 그런거네요. 

Member.setTeam 메소드를 변경했고,
Team.addMember 메소드를 추가했습니다.

그리고 제가 잘못 말씀드린게 있는데요.
EntityManager.persist는 insert(save)가 맞고요.
EntityManager.merge가 update 입니다.
@Entity
private class Member {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

private String name;

@ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "TEAM_ID")
private Team team;

    public void setName(String name) {
this.name = name;
}

public void setTeam(Team team) {
team.addMember(this);
this.team = team;

}
}

@Entity
private class Team {

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

private String name;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "team")
private Collection<Member> members = new ArrayList<>();

    public void setName(String name) {
this.name = name;
}

public Collection<Member> getMembers() {
return members;
}

public void addMember(Member member) {
this.members.add(member);
}
}

2017년 5월 8일 (월) 오후 4:39, Kyung Won Lee <leek...@gmail.com>님이 작성:

namkyu Lee

unread,
May 14, 2017, 8:25:32 PM5/14/17
to ks...@googlegroups.com
이제서야 답변을 드려 죄송합니다.
말씀하신 대로 연관관계 매핑을 위해 메서드를 추가하여 테스트 성공하였습니다.

이런 테스트 케이스에서 객체간 연관관계 매핑이 중요하다는 것을 몰랐었네요.
코드와 함께 상세한 설명해 주셔서 감사합니다.




2017년 5월 8일 오후 4:57, Kyung Won Lee <leek...@gmail.com>님이 작성:
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+unsubscribe@googlegroups.com에 이메일을 보내세요.

https://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/f11eeecf-0072-4c20-82bc-5f434a588ac8%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+unsubscribe@googlegroups.com에 이메일을 보내세요.

https://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
Reply all
Reply to author
Forward
0 new messages