카테고리 없음

[JPA] @ManyToOne N:1 관계

오늘의 진 2023. 1. 10. 15:18

@ManyToOne 속성 

  • targetEntity
  • cascade
  • fetch
  • optional 

Optional은 false 일때 해당 객체에 null 이 들어갈수 있다. 

반대로 true 이면 not null 설정이된다. 

 

(예)

@Data
@Entity
@NoArgsConstructor
public class ClassRoom {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "classroom_seq_gen")
    @SequenceGenerator(sequenceName = "classroom_seq", name = "classroom_seq_gen", allocationSize = 1)
    @Column(name = "id")
    private Long classRoomId;

    private String roomName;

    public ClassRoom (String roomName) {
        this.roomName = roomName;
    }
}
@Data
@Entity
@NoArgsConstructor
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_seq_gen")
    @SequenceGenerator(sequenceName = "student_seq", name = "student_seq_gen", allocationSize = 1)
    @Column(name = "id")
    private Long studentId;

    private String name;

    @ManyToOne
    @JoinColumn(name = "class_room_id")
    private ClassRoom classRoom;
    // 즉 ClassRoom 테이블의 class_room_id가 부모키가 된다. (참조키) 부모키 1 대 자식키 다 형태 (1:n 형태 )
    //그러므로 부모키가 없으면 생성 불가 (단방향) 부모키에 @OneToMany를 함께 적어주면 쌍방향
    //

    public Student (String name) {
        this.name = name;
    }

    public void setClassRoom (ClassRoom classRoom) {
        this.classRoom = classRoom;
    }
}

 

위의 예제에서는 student에서 classRoomId에 외래키를 걸어준것이다. 

 

이런경우 레포지 토리에서는  아래와 같이 join을 해준다. 

public interface StudentRepository extends JpaRepository<Student, Long> {

    @Query("select s from Student s join s.classRoom cr where cr.roomName = :roomName")
    Optional<Student> findStudentByRoomName (String roomName);

    @Query("select s from Student s join s.classRoom cr where cr.roomName = :roomName")
    List<Student> findStudentListByRoomName (String roomName);
}

현재 형태는 M:1 단방향 형태이다. 

 

만약 student에서 class_room_id자리에 classRoom에 없는 class_room_id를 넣고 insert를 하려고하면 

오류가 발생! 

student의 class_room_id는 classRoom의 것을 참조한다. 

그리고 삭제에 대한 설정을 따로 안해주었을때는 

pk키는 fk키가 존재할떄 삭제 불가능