September 29, 2021
JPA는 Entity 객체를 생성할 때, 기본 생성자를 사용한다.
@Table
: 매핑할 테이블 이름@Column
속성 | 기능 | 기본값 |
---|---|---|
name | 필드와 매핑할 테이블의 컬럼이름 | 객체의 필드 이름 |
insertable | Entity 저장 시 필드도 같이 저장한다. (false : 읽기 전용) | true |
updatable | Entity 수정 시 필드도 같이 수정한다. (false : 읽기 전용) | true |
nullable | null 값 허용 여부를 설정한다. (false : not null 제약조건이 추가됨) | true |
unique | 해당 컬럼의 유니크 제약조건을 추가한다. | |
length | 문자 길이 제약조건으로 사용한다. (String 타입에만 사용) | 255 |
@Id
@GeneratedValue(strategy = GenerationType.전략이름)
JPA는 RDB의 테이블과 매핑된 객체(Entity)를 객체답게 사용할 수 있도록 여러가지 고급 매핑 전략을 제공해준다.
조인 테이블 전략
@Inheritance(strategy = Interitance.JOINED)
싱글 테이블 전략
@Entity
@Table(name = "item")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class item {
}
@Entity
@DiscriminatorValue("FOOD")
public class Food extends Item {
}
현업에서는 싱글 테이블 전략을 많이 사용한다. (조인 테이블 전략은 객체지향적이지 않다고 한다.)
@MappedSuperclass
public class BaseEntity {
@Column(name = "created_by")
private String createdBy;
@Column(name = "created_at", columnDefinition = "TIMESTAMP")
private LocalDateTime cratedAt;
}
JPA에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다.
JPA는 영속성 컨텍스트에 Entity를 보관할때, eqauls & hashCode를 이용해서 동등성 비교를 한다
@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
private String id1;
@Id
private String id2;
}
@EqualsAndHashCode
public class ParentId implements Serializable {
private String id1;
private String id2;
}
@Entity
public class Parent2 {
@EmbeddedId
private ParentId2 id;
}
@EqualsAndHashCode
@Embeddable
public class ParentId2 implements Serializable {
private String id1;
private String id2;
}
Entity는 객체가 데이터베이스(RDB)와 매핑되어 있어서 자유롭개 객체를 탐색하는데 제한이 있다.
JPA는 프록시라는 기술을 사용하여 연관된 객체를 처음부터 데이터베이스에서 조회하지 않고, 실제 사용하는 시점에 조회할 수 있다.
프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다.
지연로딩
@ManayToOne(fetch = FatchType.EAGER)
즉시로딩
@ManayToOne(fetch = FatchType.EAGER)
특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속상태로 만들고 싶을 때 사용한다.
영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.