@Entity
매핑 애너테이션을 이용해 엔티티 클래스와 테이블을 매핑@Entity
애너테이션을 붙이면 JPA 관리 대상 엔티티가 된다.name
애트리뷰트 - name
@Entity
애너테이션과 @Id
애너테이션은 필수
파라미터가 없는 기본 생성자는 필수로 추가 → 없으면 에러 종종 발생
@Id
애너테이션 필드에 직접 추가 @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // IDENTITY 전략
private Long memberId;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE) // SEQUENCE 전략
private Long memberId;
@GeneratedValue(strategy = GenerationType.AUTO)
// (1)
@Column(nullable = false, updatable = false, unique = true)
private String email;
@Column
애너테이션이 없고, 필드만 정의되어 있다면 JPA는 기본적으로 이 필드가 테이블의 컬럼과 매핑되는 필드라고 간주하고, @Column
애너테이션에 사용되는 애트리뷰트의 값은 디폴트 값이 모두 적용된다.true
true
false
255
java.util.Date
, java.util.Calendar
타입으로 매핑하기위해서는 @Temporal
LocalDateTime
타입일 경우, @Temporal
생략가능LocalDateTime
은 컬럼의 TIMESTAMP 타입과 매핑enum 타입과 매핑할 때 사용하는 애너테이션
EnumType.ORDINAL
: enum의 순서를 나타내는 숫자를 테이블에 저장
기존에 정의되어 있는 enum 사이에 새로운 enum 하나가 추가 된다면
enum 순서 번호와 enum에 정의되어 있는 순서가 일치하지 않게 되는 문제가 발생
EnumType.STRING
: enum의 이름을 테이블에 저장(권장)
주의사항
@Column
애너테이션이 생략된 경우 기본적으로 nullable=true
null
값을 입력 불가null
은 객체 타입일 경우에만 적용nullable=false
로 설정하자JPA는 단방향 연관 관계와 양방향 연관 관계를 모두 지원하는 반면에 Spring Data JDBC는 단방향 연관 관계만 지원
@Entity
public class Order{
@ManyToOne // 다대일
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
@OneToMany(mappedBy = "member") //일대다
private List<Order> orders = new ArrayList<>();
findOrder.getMember().getMemberId()
@OneToMany(mappedBy = "member")
**mappedBy
선정 기준 (1) 두 객체들 간에 외래키의 역할을 하는 필드는 무엇인가? (2) 외래키의 역할을 하는 필드는 다(N)에 해당하는 클래스 안에 있다.모든 관계의 중심을 외래키에서 부터 시작한다.
@ManyToOne
단방향 방식, 양방향 방식과 동일@OneToOne
애너테이션을 사용CascadeType.ALL
: 모든 Cascade를 적용CascadeType.PERSIST
: 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지CascadeType.MERGE
: 엔티티 상태를 병합(Merge)할 때, 연관된 엔티티도 모두 병합CascadeType.REMOVE
: 엔티티를 제거할 때, 연관된 엔티티도 모두 제거CascadeType.DETACH
: 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 XCascadeType.REFRESH
: 상위 엔티티를 새로고침(Refresh)할 때, 연관된 엔티티도 모두 새로고침public interface MemberRepository extends JpaRepository<Member, Long>
JPQL을 통한 객체 지향 쿼리 사용
ex) SELECT c FROM Coffee c WHERE c.coffeeId = :coffeeId
c
는 클래스의 별칭네이티브 SQL을 통한 조회