@Entity, @Table
@Column
@Id
@ManyToOne, @JoinColumn
@Entity
가 붙은 클래스는 JPA가 관리.@Entity
필수@Table
은 엔티티와 매핑할 테이블 지정@Entity
@Table(name = "MBR")
public class Member {}
위와 같이 하게 되면, 데이터베이스에서 MBR이라는 테이블을 찾음.
hibernate.hbn2ddl.auto
운영할때는 절대 create, create-drop, update 사용하면 안된다.
@Column
: 컬럼 매핑
@Temporal
: 날짜 타입 매핑
@Enumerated
: enum 타입 매핑
@Lob
: BLOB, CLOB 매핑
@Transient
: 특정 필드를 컬럼에서 제외. DB로 생성안함.
name
: 테이블 컬럼 이름. 기본값은 객체의 필드이름.
insertable, updatable
: 등록, 변경 가능 여부. 기본값 true
nullable(DDL)
: null
값의 허용 여부. false
로 설정하면 DDL 생성시에 not null
넣어줌.
unique(DDL)
: @Table
의 uniqueConstraints
와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸때 사용
columnDefinition(DDL)
: 데이터베이스 컬럼 정보를 직접 줄 수 있다.
ex) varchar(100) default 'EMPTY'
length(DDL)
: 문자 길이 제약 조건, String
타입에만 사용
precision, scale(DDL)
: BigDecimal
나 BigInteger
타입에서 사용한다. percision
은 소수점을 포함한 전체 자릿수이고, scale
은 소수의 자릿수이다. double, float
타입에는 적용되지 않는다. 정밀한 소수를 다룰때 사용
옵션에서 EnumType.STRING
을 써야한다.
EnumType.ORDINAL
을 쓰면, 인덱스 값으로 저장하게 되는데 나중에 순서 바뀌면 난리남.
DB에서 날짜 타입
TIMESTAMP
- 시간 + 날짜
Date
- 날짜
TIME
- 시간
자바에서는 LocalDateTime
을 쓰면, 자동으로 timestamp
로 DB에 저장된다.
LocalDate
, Date
는 date
로 저장된다.
Date
타입을 쓰면서 DB에는 timestamp
로 쓰고 싶다면,
@TemporalTemporalType.TIMESTAMP)
private Date abcd;
이렇게 하면 된다. 근데 그냥 LocalDateTime
쓰는게 좋을듯?
데이터베이스 BLOB, CLOB 타입과 매핑
@Id
만 사용@Generate
)IDENTITY: 데이터베이스에 위임, MYSQL
SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
@SequenceGenerator
필요TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator
필요AUTO: 방언에 따라 자동 지정
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequencename = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
처럼 매핑할 수 있는데 요즘에는 그냥 DDL이 알아서 해줌.
이 부분은 딱히 알아볼 내용이 없을 것 같아서 스킵
그러니까 모아서 나중에 커밋시점에 한번에 저장하는 전략이 안됨.
그렇다면, em.persist할때마다 DB를 소환하면 성능이 떨어질 수 있다. 이를 위해 Sequence가 등장
name
: 식별자 생성기 이름. 필수값
sequenceName
: 데이터베이스에 등록되어 있는 시퀀스 이름
initialValue
: DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할때 처음 1 시작하는 수
allocationSize
: 성능 최적화에 사용됨. 데이터 시퀀스의 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다.. 기본값 50.
catalog, schema
: 데이터베이스 catalog, schema 이름
allocationSize
가 50으로 설정되어 있을때, 처음에 데이터를 저장할때 시퀀스 값이 1로 세팅되어있으면 시퀀스를 한번 더 호출하여 1+50으로 51 크기로 처음부터 공간을 땡겨온다.
이후로 값을 저장할때는 그냥 메모리에서 저장하는 형식이다.
만든 내용은 생략