참치코더의 꿈 메모장

JPA / 단방향 엔티티 연관관계(多 : 一) 정리 본문

JPA

JPA / 단방향 엔티티 연관관계(多 : 一) 정리

참치깡 2025. 10. 6. 17:19
728x90

 

JPA에서 단방향 연관관계는 엔티티 A -> B 방향으로만 참조가 존재하고, B -> A 방향은 없는 구조를 말한다.

 

단방향 연관관계

 

- Member가 Team을 참조하지만, Team은 Member를 모르는 경우가 단방향 연관관계이다.

 

Member -> Team : O (참조 존재)

Team -> Member : X (참조 없음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Team
 
@Entity
@Getter
@Setter
public class Team {
    @Id
    @GeneratedValue
@Column(name = "TEAM_ID")
    private Long id;
 
    private String name;
}
 
// Member
 
@Entity
@Getter
@setter
public class Member {
    @Id
    @GeneratedValue
    private Long id;
 
    private String username;
 
    // 단방향 연관관계 : Member -> Team (다대일)
    @ManyToOne
    @JoinColumn(name = "TEAM_ID"// 참조하는 외래키 이름
    private Team team;
    
}
 
// 실행코드
 
public class JpaMain {
    public static void main(String[] args) {
 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
 
        tx.begin();
        
        try {
           
            // 팀A 생성
            Team teamA = new Team();
            teamA.setName("팀A");
            em.persist(teamA);
 
            // 회원 생성
            Member member = new Member();
            member.setUsername("회원1");
            member.setTeam(teamA); // 단방향 관계 설정 (연관관계 주인)
            em.persist(member);
 
            em.flush();
            em.clear();
 
            // 조회
            Member findMember = em.find(Member.class, member.getId());
            Team team = findMember.getTeam(); // 객체 그래프 탐색
            System.out.println("팀이름 : " + team.getName());
 
            // 수정
            // 팀B 생성
            Team teamB = new Team();
            teamB.setName("팀B");
            em.persist(teamB);
 
            // 회원1 팀 변경
            findMember.setTeam(teamB);
 
            // 연관관계 제거
              findMember.setTeam(null);
 
            // 팀 삭제 전 flush (외래키 null 보장)
            em.flush();
            em.remove(teamA);
            em.remove(teamB);
 
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            em.close();
        }
 
        emf.close();
 
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
cs

 

- 항상 다대일 관계에서 다쪽을 연관관계 주인으로 권한을 줘야 한다.

 

- 양방향 엔티티 관계에서 다쪽을 연관관계 주인으로 줘야 복잡하지 않은 쿼리를 짤 수 있고, 개발하는데 편하다.

728x90
Comments