엔티티 클래스와 테이블 매핑(필수)
❗️attribute
PK 설정(필수)
테이블 설정(Option, 추가하지 않으면 클래스 이름 = 테이블 이름)
❗️attribute
❗️ @Entity
@Id
애너테이션 필수
❗️ 파라미터가 없는 기본 생성자 필수 추가
➡️ Spring Data JPA의 기술 적용 시 기본 생성자가 없는 경우 에러 발생
❗️ 중복되는 엔티티 클래스가 없고, 테이블 이름 = 클래스 이름인 경우, name
attribute 지정 x
@Id
애너테이션을 추가한 필드가 PK
➡️ JPA: 어떤 방식으로 PK를 생성해 줄 것인지에 대한 전략을 지원해줌
애플리케이션 코드 상 직접 할당
➡️ @Id
애너테이션 추가, 인자로 id 값 넣어서 엔티티 생성
@GeneratedValue(strategy = GenerationType.IDENTITY)
SEQUENCE : DB에서 제공하는 시퀀스를 사용해서 PK 설정
@GeneratedValue(strategy = GenerationType.SEQUENCE)
AUTO : JPA가 DB의 Dialect에 따라 적절한 전략을 자동으로 선택
(Dialect : 특정 DB에 특화된 고유한 기능)
@GeneratedValue(strategy = GenerationType.AUTO)
TABLE : 별도의 키 생성 테이블을 사용
❗️attribute
nullable : 컬럼에 null을 허용할지 여부 (default : true)
updatable : 컬럼 데이터를 수정할 수 있는지 여부 (default: true)
❗️int
or long
과 같은 원시 타입의 경우, @Column
애너테이션이 생략되면 nullable = false
➡️ @Column
애너테이션을 추가하면 테이블에는 int price
로 설정 (default: true)
➡️ 테이블에서 int price not null
로 하려면 @Column(nullable=false)
애너테이션 추가 or @Column
애너테이션 자체를 사용 x
테이블 컬럼과 매핑하지 않음을 명시 ➡️ 주로 임시 데이터에 사용
enum 타입과 매핑
✔️ EnumType.ORDINAL
: enum의 숫자
✔️ EnumType.STRING
: enum의 이름
❗️PK 생성 전략은 IDENTITY
혹은 SEQUENCE
권장
❗️@Column
애너테이션 사용 시, 엔티티 클래스 필드 타입이 java의 원시타입인 경우 @Column(nullable=false)
로 설정 권장
❗️@Enumerated
애너테이션 사용 시 EnumType.ORDINAL
로 설정하면 추후에 enum 추가 시 숫자가 꼬여서 오류날 수 있음!
➡️ EnumType.STRING
권장
✔️ Spring Data JDBC에서는 단방향 매핑만 지원했지만, JPA는 단방향과 양방향을 모두 지원함
✔️ JPA는 엔티티 간에 일대다
, 다대일
, 다대다
, 일대일
연관 관계 매핑을 지원
❗️단방향 연관 관계 : 한 쪽 클래스만 다른 쪽 클래스의 참조 정보를 갖는 관계
❗️양방향 연관 관계 : 양쪽 클래스가 서로의 참조 정보를 갖는 관계
❗️테이블 간 연관 관계에서 다(N)에 해당하는 테이블이 일(1)에 해당하는 테이블의 PK를 FK로 가짐
일(1)에 해당하는 클래스가 다(N)에 해당하는 객체를 참조할 수 있는 관계
단방향 매핑
일대다 단방향 매핑의 경우, 일(1)에 해당하는 테이블이 다(N)에 해당하는 테이블의 PK를 FK로 가짐
➡️ 정상적인 테이블 표현 불가!
➡️ 일대다 단방향 매핑은 거의 사용하지 않음
➡️ 다대일 단방향 매핑을 사용하자❗️
➕ 필요하면 일대다 단방향을 추가해서 양방향으로 만들자❗️
다(N)에 해당하는 클래스가 일(1)에 해당하는 객체를 참조할 수 있는 관계
@ManyToOne : 다대일 연관 관계 매핑
@JoinColumn(name = FK 컬럼명) : 외래키 매핑
❗️양방향 매핑 = 다대일 + 일대다
@OneToMany(mappedBy = field) : 일대다 연관 관계 매핑
mappedBy: 관계를 소유하고 있는 필드를 지정(N에서 외래키 역할을 하는 필드)
다대다 연관 관계는 테이블 설계 시, 중간 테이블을 추가해서 두 개의 일대다 관계를 만드는 것이 일반적임
다대일 단방향 연관 관계 매핑과 동일하게 적용. 양방향도 동일(@JoinColumn 필요)
@OneToOne : 일대일 연관 관계 매핑