STUDENT 클래스와 MAJOR 클래스가 존재한다고 하자.

Major 클래스는 Long타입의 Id(필드명), String타입의 majorName(필드명) 속성 2개를 가지고 있다.
1) @Id 애노테이션을 통해 Major 테이블의 PRIMARY KEY가 Id 라고 설정했다.
2) @Column(name="MAJOR_ID") 와 @Column(name="MAJOR_FIELD") 애노테이션을 통해 DB 테이블 내의 컬럼명을 지정해 준 것이다.

: Major 테이블을 보면, 필드명이 MAJOR_ID, MAJOR_FIELD 로 저장됐다!!
3) @GeneratedValue(strategy = GenerationType.IDENTITY) 애노테이션을 통해, Id값을 직접 지정해주지 않아도, AUTO_INCREMENT로 인식되어 알아서 ID값을 지정해준다.
위의 결과에서 MAJOR_ID의 Extra에 auto_increment로 설정되어있음을 볼 수 있다.
즉, Major major = new Major("컴퓨터 공학"); 을 실행하면

MAJOR_ID가 자동적으로 1번으로 지정된다.

Major 클래스와 마찬가지로 , @Id, @Column, @GeneratedValue 애노테이션을 사용해서 STUDENT 테이블의 속성을 설정해 주었다.
위의 코드에서
@ManyToOne은 어떤 애노테이션일까?
테이블 간의 연관 관계가 있을 때, JPA는 객체지향 스럽게 사용하는 제공한다.
기존의 DB에서는 외래키(Foreign Key)를 사용하지만, JPA에서는 객체를 참조하는 방식으로 연관 관계를 매핑할 수 있다.
여러개의 테이블이 하나의 테이블과 연관 관계를 맺을 때 사용한다.
연관 관계의 주인 : N (Student)
Student : Major = N : 1 이다.
Major는 여러 명의 학생을 가질 수 있지만, Student는 1개의 전공밖에 갖지 못하기 때문에 설정해준 것이다.
@JoinColumn(name = "MAJOR_ID") 는 연관 관계를 이어주도록 외래키를 설정해주는 애노테이션이다.


Student 테이블에 MAJOR_ID 필드가 존재하고, MUL = 외래키 라는 의미이다.
JPA에서 엔티티란, DB 테이블에 대응하는 하나의 클래스라고 생각할 수 있다.
@Entity가 붙은 클래스는 JPA가 관리해주며,
JPA를 사용해서 DB 테이블과 매핑할 클래스는 꼭 @Entity를 붙여야만 매핑이 가능하다.
[ Entity 사용시 주의사항 ]
기본 생성자필수, 접근 제어자는 public 또는 protected여야 한다.
final 클래스, interface, inner 클래스에스 사용이 불가능 하다.
저장할 필드에는 final을 붙이면 안된다. (final을 붙이면 테이블에 매핑되지 않는다)
@Entity Annotation을 통해, STUDENT와 MAJOR를 Entity 클래스로 만들어 줬다.
Entity 클래스는 실제 DataBase 테이블과 1:1 매핑되는 객체로,
DB의 테이블 내에 존재하는 컬럼만을 속성(필드)로 가져야한다.
즉, CREATE TABLE 테이블명 (필드명 타입, 필드명 타입 .... PRIMARY KEY(필드명)) 과 같이 QUERY문을 직접 적을 필요가 없어진 것이다.
JPA의 @Entity를 통해 클래스를 Entity 클래스로 만들어줌으로서,
객체 지향적으로 TABLE을 생성할 수 있는 것이다.

원래는 이런 식으로 TABLE을 DB에 생성했어야 했다.