@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키가 존재할떄 삭제 불가능